繁体   English   中英

无法访问GridViewColumn的内容内的事件

[英]Can't access the events inside the GridViewColumn's Content

当我将事件添加到ListViewItem

<Style TargetType="{x:Type ListViewItem}">
    <EventSetter Event="PreviewMouseDown" Handler="listViewItem_MouseDown" />
</Style>

然后在GridViewColumn内部的内容中添加另一个事件,

<GridViewColumn Header="Action">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Image x:Name="imgEdit"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Left"
                   Width="40"
                   Height="40"
                   Tag="{Binding ProductBarcode}"
                   Cursor="Hand"
                   MouseDown="img_MouseDown">
                <Image.Style>
                    <Style TargetType="{x:Type Image}">
                        <Setter Property="Source" Value="/Resources/edit_button.png" />
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Source" Value="/Resources/edit_button_hovered.png" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我无法在Image控件中触发该事件。 引发事件的是ListViewItem的事件。 如何在Image控件中访问事件?

这是事件:

private void img_MouseDown(object sender, MouseButtonEventArgs e)
{
    switch ((sender as Image).Name)
    {
        case "imgEdit":
            MessageBox.Show("EDIT");
            break;
        default:
            break;
    }
}
private void listViewItem_MouseDown(object sender, RoutedEventArgs e)
{
    MessageBox.Show("ROW CLICKED");
}

ListViewItemPreviewMouseDown事件将始终在Image的MouseDown事件之前引发。 路由事件的工作方式如下: https : //msdn.microsoft.com/zh-cn/library/ms742806(v=vs.110).aspx PreviewMouseDown是一个隧道事件,而MouseDown是一个冒泡事件。

如果您不想在单击Image时处理PreviewMouseDown事件,则可以检查RoutedEventArgsOriginalSource的类型,如果它是Image则从事件处理程序中立即返回:

private void listViewItem_MouseDown(object sender, RoutedEventArgs e)
{
    if (e.OriginalSource is Image)
        return; // do nothing

    MessageBox.Show("ROW CLICKED");
}

尝试:

private void listViewItem_MouseDown(object sender, MouseButtonEventArgs e)
{
    Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    {
        MessageBox.Show("ROW CLICKED");
    }));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM