单击叠加按钮时忽略 ListViewItem 的 EventViewer

问题描述 投票:0回答:1

我有一个程序,我正在创建一个ListView,其中包含一系列我以编程方式添加的ListViewItems。我还覆盖了一个按钮,允许您从 ListView 中删除该项目。但是,当我单击它时,它会激活我为整个 ListView 添加的 EventSetter,我希望在单击此按钮时忽略它。

有没有一种方法可以使当您单击该按钮时,仅触发该事件而不是 ListViewItem 的事件?我尝试在按钮单击的功能中设置

e.Handled=true
但不起作用。

提前致谢。

<ListView
    x:Name="SavedClipboardList"  
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    ScrollViewer.VerticalScrollBarVisibility="Hidden"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
    Width="600"
    Height="460"
    Background="#282828"
    BorderThickness="0"
    HorizontalContentAlignment="Stretch"
    VirtualizingPanel.ScrollUnit="Pixel">

    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="BorderBrush" Value="LightGray" />
            <Setter Property="BorderThickness" Value="1,1,1,1" />
            <Setter Property="Margin" Value="20, 0, 20, 5" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="SavedClipboardList_ItemClick"/>
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <StackPanel Orientation="Horizontal" Width="525">
                    <Image Source= "/Assets/Placeholder.png" HorizontalAlignment="Left"/>
                    <TextBlock Text= "{Binding body}" FontWeight="Bold" Foreground="#ffffff"/>
                </StackPanel>
                
                <StackPanel Orientation="Vertical" HorizontalAlignment="Right" Width="Auto">
                    <Button BorderThickness="0" Background="Transparent" Foreground="#FFFFFF" Click="btnRemove_Click">X</Button>
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>

</ListView>
c# wpf xaml
1个回答
0
投票

PreviewMouseLeftButtonDown
是一个隧道事件,在 Click
Button
事件之前
引发。

有没有一种方法可以使当您单击该按钮时,仅触发该事件而不是 ListViewItem 的事件?

如果您不想在单击

Button

 时处理隧道事件,您可以检查传递给 
OriginalSource
 事件处理程序的 
MouseButtonEventArgs
SavedClipboardList_ItemClick
 是否是 
Button
 的一部分:

private void SavedClipboardList_ItemClick(object sender, MouseButtonEventArgs e) { if (e.OriginalSource is Button || (e.OriginalSource is DependencyObject dependencyObject && FindParent<Button>(dependencyObject) != null)) return; // handle item click just like before... } private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject { var parent = VisualTreeHelper.GetParent(dependencyObject); if (parent == null) return null; var parentT = parent as T; return parentT ?? FindParent<T>(parent); } private void btnRemove_Click(object sender, RoutedEventArgs e) { // handle button click... }
您无法阻止 

PreviewMouseLeftButtonDown

 事件的引发。

© www.soinside.com 2019 - 2024. All rights reserved.