【发布时间】:2019-12-20 00:53:48
【问题描述】:
我已经搜索了许多类似的问题,但似乎没有一个可以处理这种情况。我试图通过右键单击列表视图项(工作)和当用户左键单击更多省略号按钮(不工作)来打开上下文菜单。这适用于我的程序的另一部分,我在树视图中执行基本相同的操作,省略号按钮和右键单击树视图项都会打开上下文菜单。但是,在这种情况下,单击省略号按钮不会打开上下文菜单,只能右键单击该图块。它甚至没有命中按钮单击处理函数背后的代码中的断点。
我有一个 ListView 设置如下:
<ListView x:Name="listViewStudents"
ItemsSource="{Binding Students}"
SelectionChanged="StudentList_SelectionChanged">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Height" Value="36"></Setter>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.ContextMenu>
<ContextMenu x:Name="StudentContextMenu">
<ContextMenu.Items>
<MenuItem Header="View Details"
Command="{Binding Source={x:Reference studentDetailsView}, Path=DataContext.OpenLinkCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.DataContext}">
</MenuItem>
</ContextMenu.Items>
</ContextMenu>
</Grid.ContextMenu>
<TextBlock Grid.Column="1" Margin="0" Text="{Binding Name}" Foreground="Black" FontFamily="{StaticResource FontFamilyBody1}" FontSize="15"/>
<Button Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Right" Click="MoreButton_Click" Width="50" Margin="0,0,-14,0">
<materialDesign:PackIcon Kind="MoreVert"/>
</Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
下面是代码:
private void MoreButton_Click(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
ContextMenu menu = (ContextMenu)(button).FindName("StudentContextMenu");
menu.DataContext = button.DataContext;
menu.IsOpen = true;
}
那么为什么这个 ListView 在数据模板中没有一个按钮调用该函数来打开一个上下文菜单呢?为什么它会在 TreeView 上工作,但不是在这里?非常感谢任何帮助。
EDIT:我注释掉了 EventSetter "PreviewMouseLeftButtonDown" 以及后面代码中的处理函数,现在 xaml 中的按钮似乎工作得很好(它正在打开上下文菜单)。但是对于应用程序的某些逻辑,我需要 EventSetter 和处理程序。为什么 PreviewMouseLeftButtonDown 事件会阻止按钮事件?有没有办法让两者都工作?
【问题讨论】:
-
你的代码对我来说似乎工作得很好。
-
@mm8 我刚刚对其进行了测试,并在我的帖子底部进行了编辑评论。关于为什么我不能同时拥有 previewmouseleftbuttondown 和按钮单击事件的任何想法?