我有一个程序,我正在创建一个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>
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
事件的引发。