禁用某些DatGrid单元格WPF上的上下文菜单
我已经定义了这样的数据网格::禁用某些DatGrid单元格WPF上的上下文菜单,wpf,datagrid,contextmenu,datagridcell,Wpf,Datagrid,Contextmenu,Datagridcell,我已经定义了这样的数据网格:: <cc:PEDataGrid AutoGenerateColumns="False" ItemsSource="{Binding Rows}" Width="Auto" PreviewMouseRightButtonDown="PEGrid_PreviewMouseRightButtonDown" Load
<cc:PEDataGrid AutoGenerateColumns="False"
ItemsSource="{Binding Rows}"
Width="Auto"
PreviewMouseRightButtonDown="PEGrid_PreviewMouseRightButtonDown"
Loaded="CommonPEGrid_Loaded">
<wpfkit:DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Cut" />
<MenuItem Header="Copy"/>
<MenuItem Header="Paste"/>
</ContextMenu>
</wpfkit:DataGrid.ContextMenu>
</cc:PEDataGrid>
我想知道我哪里做错了!!请帮我解决这个问题。如果我以错误的方式实现了我的需求,请指导我以更好的方式完成:)嘿,我解决了它::我修改的代码如下::
private void PEGrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
DependencyObject depObj = (DependencyObject)e.OriginalSource;
while ((depObj != null) && !(depObj is DataGridColumnHeader))
{
depObj = VisualTreeHelper.GetParent(depObj);
}
if (depObj == null)
{
return;
}
if (depObj is DataGridColumnHeader)
{
dg.ContextMenu.Visibility = Visibility.Visible; //works
}
else
{
dg.ContextMenu.Visibility = Visibility.Collapsed; //works
}
}
我认为这个版本要快得多,而且您不必设置上下文菜单的可见性。如果单击是在列标题上,则只需取消单击事件
private void PEGrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
var depObj = (DependencyObject)e.OriginalSource;
while ((depObj != null) && !(depObj is DataGridColumnHeader))
{
depObj = VisualTreeHelper.GetParent(depObj);
}
if (depObj is DataGridColumnHeader)
{
e.Handled = true;
}
}
DataGridCell中的RichTextBox不是VisualTree元素。我的代码:
private void dgLog_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkContentElement fce = e.OriginalSource as FrameworkContentElement;
DependencyObject depObj = e.OriginalSource as DependencyObject;
DataGridCell dgc = null;
DataGridRow dgr = null;
try
{
while (fce != null && !(fce is DataGridCell))
{
depObj = fce.Parent;
fce = depObj as FrameworkContentElement;
}
while (depObj != null && !(depObj is DataGridRow))
{
if (depObj is DataGridCell)
dgc = depObj as DataGridCell;
depObj = VisualTreeHelper.GetParent(depObj);
}
if (depObj == null)
return;
dgr = depObj as DataGridRow;
if (((LogRecord)dgr.Item).SourceType == "FileMessage" && dgc.Column.DisplayIndex == 1)
dgLog.ContextMenu = cm_dgLog;
else
dgLog.ContextMenu = null;
}
catch (Exception ex)
{
MessageBox.Show(...);
TraceHelper.TraceError(ex, GetType());
}
}//private void dgLog_PreviewMouseRightButtonDown
LogRecord是DataGridColumn.Item的类型
private void dgLog_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkContentElement fce = e.OriginalSource as FrameworkContentElement;
DependencyObject depObj = e.OriginalSource as DependencyObject;
DataGridCell dgc = null;
DataGridRow dgr = null;
try
{
while (fce != null && !(fce is DataGridCell))
{
depObj = fce.Parent;
fce = depObj as FrameworkContentElement;
}
while (depObj != null && !(depObj is DataGridRow))
{
if (depObj is DataGridCell)
dgc = depObj as DataGridCell;
depObj = VisualTreeHelper.GetParent(depObj);
}
if (depObj == null)
return;
dgr = depObj as DataGridRow;
if (((LogRecord)dgr.Item).SourceType == "FileMessage" && dgc.Column.DisplayIndex == 1)
dgLog.ContextMenu = cm_dgLog;
else
dgLog.ContextMenu = null;
}
catch (Exception ex)
{
MessageBox.Show(...);
TraceHelper.TraceError(ex, GetType());
}
}//private void dgLog_PreviewMouseRightButtonDown
对不起。第一次尝试不太好。我使用此响应作为停止在标题上显示上下文菜单的基础。感谢您发布最终功能解决方案。如果我在OnMouseRIghtButtonUp事件中使用此代码,那么这里唯一适合我的版本。
private void dgLog_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkContentElement fce = e.OriginalSource as FrameworkContentElement;
DependencyObject depObj = e.OriginalSource as DependencyObject;
DataGridCell dgc = null;
DataGridRow dgr = null;
try
{
while (fce != null && !(fce is DataGridCell))
{
depObj = fce.Parent;
fce = depObj as FrameworkContentElement;
}
while (depObj != null && !(depObj is DataGridRow))
{
if (depObj is DataGridCell)
dgc = depObj as DataGridCell;
depObj = VisualTreeHelper.GetParent(depObj);
}
if (depObj == null)
return;
dgr = depObj as DataGridRow;
if (((LogRecord)dgr.Item).SourceType == "FileMessage" && dgc.Column.DisplayIndex == 1)
dgLog.ContextMenu = cm_dgLog;
else
dgLog.ContextMenu = null;
}
catch (Exception ex)
{
MessageBox.Show(...);
TraceHelper.TraceError(ex, GetType());
}
}//private void dgLog_PreviewMouseRightButtonDown