无法访问GridViewColumn内容中的事件

时间:2017-04-24 07:09:04

标签: c# wpf

当我向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");
}

2 个答案:

答案 0 :(得分:1)

PreviewMouseDown的{​​{1}}事件将始终在图片的ListViewItem事件之前引发。这是路由事件的工作方式:https://msdn.microsoft.com/en-us/library/ms742806(v=vs.110).aspxMouseDown是一个隧道事件,PreviewMouseDown是一个冒泡事件。

如果您在单击MouseDown时不想处理PreviewMouseDown事件,则可以检查Image的{​​{1}}的类型并立即返回事件处理程序,如果它是OriginalSource

RoutedEventArgs

答案 1 :(得分:-2)

尝试:

if !UserDefaults.standard.bool(forKey: "wasOpenedBefore") {
    //the app is opened for the first time - do what you need
    UserDefaults.standard.set(true, forKey: "wasOpenedBefore")
}