當點擊DataGrid中的單元格時,我想不時顯示上下文菜單。 我以編程方式創建ContextMenu,然後使用ContextMenu.IsOpen = true顯示它。在下面的例子中,它在Grid面板內單擊時工作,但它不會單擊DataGrid的單元格(單元內的UIElement)。WPF DataGrid:左鍵單擊時顯示動態上下文菜單
這是區別嗎?我還需要做些什麼來使它在DataGridCell上工作?
這裏有一個演示版本,第一個XAML和下面的代碼。
<Window x:Class="WpfApplication7_delete_me.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication7_delete_me"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid MouseDown="Grid_MouseDown" Background="Beige">
<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" VerticalAlignment="Top" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" MouseDown="TextBlock_MouseDown" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
這裏談到後面的代碼:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace WpfApplication7_delete_me {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
Person p1 = new Person(); p1.Name = "abc";
Person p2 = new Person(); p2.Name = "1q23";
List<Person> l = new List<Person>() { p1, p2 };
dataGrid.ItemsSource = l;
}
private void Grid_MouseDown(object sender, MouseButtonEventArgs e) {
ContextMenu cm = new ContextMenu();
MenuItem mi = new MenuItem();
mi.Header = "hallo";
cm.Items.Add(mi);
cm.IsOpen = true;
}
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) {
ContextMenu cm = new ContextMenu();
MenuItem mi = new MenuItem();
mi.Header = "hallo";
cm.Items.Add(mi);
cm.IsOpen = true;
}
}
class Person {
public string Name { get; set; }
}
}
一段時間後,我發現了兩個解決方案:
1)它使用代替的MouseDown PreviewMouseDown在工作。
2)使用:Dispatcher.BeginInvoke(new Action(() => { c.IsOpen = true; }), null);
但是爲什麼設置ISOPEN MouseDown事件中不工作?
你有檢查答案 – AnjumSKhan
我還沒有答案。我剛剛找到了解決方法。問題是,爲什麼MouseDown for DataGrid無法正常工作,而它正在爲例如Grid面板工作。 –
我提到的是顯示動態菜單檢查的標準方法msdn – AnjumSKhan