场景是:
我有一个使用DataTable作为ItemsSource的数据网格。
dataGrid.ItemsSource = LogFileItemDataTable.DefaultView;
我可以在其中内联编辑字段,其中一个是文本框。
如果是文本框,我希望能够选择一些文本并动态调出上下文菜单,其中包含项目"包含..."和"不包含......"然后做一些事情。
但是我在尝试获取事件并将上下文菜单设置为当前正在编辑的文本框时遇到了麻烦。
我的数据网格没有显式设置列,它只使用带有数据表的ItemsSource。
<DataGrid x:Name="dataGrid" Margin="10,35,10,40">
</DataGrid>
答案 0 :(得分:0)
如果您正在处理数据网格模板列,请在模板中添加以下内容:
<TextBox
Name="cxmTextBox"
Grid.Row="1"
AcceptsReturn="True"
AcceptsTab="True"
VerticalScrollBarVisibility="Visible"
TextWrapping="Wrap"
>
<TextBox.ContextMenu>
<ContextMenu
Name="cxm"
Opened="CxmOpened"
>
<MenuItem
Header="Contains"
Name="cxmItemContains"
Click="ClickContains"
/>
<MenuItem
Header="Does not contain"
Name="cxmItemNotContain"
Click="ClickNotContain"
/>
</ContextMenu>
</TextBox.ContextMenu>
</TextBox>
并添加代码:
public void CxmOpened(Object sender, RoutedEventArgs args)
{
// Only allow menu item if something is selected
if (cxmTextBox.SelectedText == "")
cxmItemContains.IsEnabled = cxmItemNotContains.IsEnabled = false;
else
cxmItemContains.IsEnabled = cxmItemNotContains.IsEnabled = true;
// Only allow paste if there is text on the clipboard to paste.
if (Clipboard.ContainsText())
cxmItemPaste.IsEnabled = true;
else
cxmItemPaste.IsEnabled = false;
}
public void cxmItemContains(object sender, RoutedEventArgs e) { //do your stuff}
public void cxmItemNotContains(object sender, RoutedEventArgs e) { //do your stuff}
答案 1 :(得分:0)
对RichTextBox
DataGrid
使用Cell
,然后使用ContextMenu
SelectionChanged
从代码中调出Event
。像这样:
<DataGridTemplateColumn Header="First" IsReadOnly="False" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RichTextBox x:Name="rtbFirst" SelectionChanged="rtbFirst_SelectionChanged">
<FlowDocument IsOptimalParagraphEnabled="True" IsHyphenationEnabled="True">
<Paragraph>
Some Text
</Paragraph>
</FlowDocument>
</RichTextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
然后
private void rtbFirst_SelectionChanged(object sender, RoutedEventArgs e)
{
//do your context menu stuff here
}