Когда я добавляю событие в 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
Carl Binalla 24 Апр 2017 в 10:09

2 ответа

Лучший ответ

Событие PreviewMouseDown ListViewItem всегда будет вызываться перед событием MouseDown изображения. Вот как работают перенаправленные события: https: // msdn.microsoft.com/en-us/library/ms742806(v=vs.110).aspx. PreviewMouseDown является событием туннелирования, а MouseDown является событием пузыря.

Если вы не хотите обрабатывать событие PreviewMouseDown при нажатии на Image, вы можете проверить тип OriginalSource RoutedEventArgs и немедленно вернуться из обработчика события. если это Image:

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

    MessageBox.Show("ROW CLICKED");
}
1
mm8 24 Апр 2017 в 09:51

Пытаться:

private void listViewItem_MouseDown(object sender, MouseButtonEventArgs e)
{
    Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    {
        MessageBox.Show("ROW CLICKED");
    }));
}
-2
mm8 24 Апр 2017 в 09:52
43581841