WPF-右键菜单ContextMenu(WPF之Button.ContextMenu)
在WPF(Windows Presentation Foundation)中,ContextMenu
是一个非常有用的控件,它允许你在用户界面元素(如按钮、文本框等)上右键点击时显示一个上下文菜单。这个菜单可以包含多个菜单项(MenuItem
),每个菜单项都可以执行特定的操作。下面是如何在WPF中使用ContextMenu
来为一个Button
控件添加右键菜单的基本步骤。
1. 定义ContextMenu和MenuItem
首先,你需要在XAML中定义ContextMenu
,并在这个ContextMenu
中定义你想要显示的MenuItem
。这可以通过直接在控件内部嵌套ContextMenu
元素来实现,或者更常见地,通过资源(Resource)或样式(Style)来定义,然后将其分配给控件。
方式1:直接在Button中定义
<Button Content="点击我" Width="100" Height="30">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="选项1" Click="MenuItem_Click"/>
<MenuItem Header="选项2" Click="MenuItem_Click_1"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
方式2:通过资源定义
<Window.Resources>
<ContextMenu x:Key="MyContextMenu">
<MenuItem Header="选项1" Click="MenuItem_Click"/>
<MenuItem Header="选项2" Click="MenuItem_Click_1"/>
</ContextMenu>
</Window.Resources>
<Button Content="点击我" Width="100" Height="30" ContextMenu="{StaticResource MyContextMenu}"/>
2. 处理MenuItem的点击事件
在上面的XAML代码中,你已经定义了MenuItem
的Click
事件处理器(例如MenuItem_Click
和MenuItem_Click_1
)。你需要在后台代码中实现这些事件处理器来执行你想要的逻辑。
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("选项1被点击");
}
private void MenuItem_Click_1(object sender, RoutedEventArgs e)
{
MessageBox.Show("选项2被点击");
}
3. 使用ContextMenu的其它特性
ContextMenu
支持许多有用的特性,比如你可以通过IsOpen
属性来控制菜单是否打开,通过Placement
属性来定义菜单的显示位置等。
4. 注意事项
- 当你为多个控件定义相同的
ContextMenu
时,使用资源(Resource)是一个很好的做法,这样可以保持代码的DRY(Don’t Repeat Yourself)原则。 - 确保
ContextMenu
的IsOpen
属性没有在你的代码中被错误地设置为false
,这可能会阻止菜单的显示。 ContextMenu
不仅仅可以绑定到Button
上,它几乎可以绑定到WPF中的任何UI元素上。
通过上述步骤,你应该能够在WPF应用程序中为一个Button
控件添加并成功使用ContextMenu
了。
实例2:
<Button Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Content="按钮_具有右键菜单">
<Button.ContextMenu>
<ContextMenu StaysOpen="true">
<MenuItem Header="File"/>
<MenuItem Header="Save"/>
<Separator/>
<MenuItem Header="Recent Files">
<MenuItem Header="ReadMe.txt"/>
<MenuItem Header="Schedule.xls"/>
</MenuItem>
</ContextMenu>
</Button.ContextMenu>
</Button>
Dictionary<string, RoutedEventHandler> dist = new Dictionary<string, RoutedEventHandler>();
//添加右键菜单项,包括名称和事件
dist.Add("添加", add_Click);
dist.Add("修改", edit_Click);
dist.Add("删除", del_Click);
dist.Add("导出", putout_Click);
dgrid.ContextMenu = ContextMenus(dist);
#region 循环生成右键菜单
private ContextMenu ContextMenus(Dictionary<string, RoutedEventHandler> list)
{
ContextMenu cm = new ContextMenu();
//Style style = (Style)this.FindResource("ContextMenu"); //定义前台显示模板
//cm.Style = style;
foreach (var dc in list)
{
MenuItem menu = new MenuItem();
//menu.Style = (Style)this.FindResource("JjxyMenuItem");
menu.Header = dc.Key;
menu.Click += dc.Value;
cm.Items.Add(menu);
}
return cm;
}
#endregion 循环生成右键菜单
示例3:
<Button Height="30" Width="30"
Content="" Foreground="#1296db" FontSize="22"
Style="{StaticResource Nav_Btn1}">
<Button.ContextMenu>
<ContextMenu Style="{StaticResource ContextAddPro}">
<MenuItem Style="{StaticResource MenuItemTemplate1}"/>
<MenuItem Header="二值化" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click">
</MenuItem>
<MenuItem Header="滤波" Style="{StaticResource MenuItemTemplate}">
<MenuItem Header="均值滤波" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
<!--<MenuItem Header="中值滤波" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>-->
<MenuItem Header="高斯滤波" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
</MenuItem>
<MenuItem Header="形态学运算" Style="{StaticResource MenuItemTemplate}">
<MenuItem Header="灰度膨胀" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
<MenuItem Header="灰度腐蚀" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
</MenuItem>
<MenuItem Header="图像增强" Style="{StaticResource MenuItemTemplate}">
<!--<MenuItem Header="锐化" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>-->
<MenuItem Header="对比度" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
<!--<MenuItem Header="亮度调节" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>-->
<MenuItem Header="灰度开运算" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
<MenuItem Header="灰度闭运算" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
<MenuItem Header="反色" Style="{StaticResource MenuItemTemplate}" Click="MenuItem_Click"/>
</MenuItem>
<MenuItem Header="图像调整" Style="{StaticResource MenuItemTemplate}">
</MenuItem>
<MenuItem Style="{StaticResource MenuItemTemplate1}"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
try
{
MenuItem menu = sender as MenuItem;
if (menu == null)
return;
string name = menu.Header.ToString();
switch (name)
{
case "二值化":
//frm_ModuleObj.m_Emhan.Add(new ThresholdImage());
break;
case "均值滤波":
frm_ModuleObj.m_Emhan.Add(new MeanImage(this));
break;
case "中值滤波":
//frm_ModuleObj.m_Emhan.Add(new EmphaImage(this));
break;
case "高斯滤波":
frm_ModuleObj.m_Emhan.Add(new GaussImage(this));
break;
case "对比度":
frm_ModuleObj.m_Emhan.Add(new EmphaImage(this));
break;
case "反色":
frm_ModuleObj.m_Emhan.Add(new InvertImage(this));
break;
case "灰度开运算":
frm_ModuleObj.m_Emhan.Add(new GrayOpening(this));
break;
case "灰度闭运算":
frm_ModuleObj.m_Emhan.Add(new GrayClosed(this));
break;
case "灰度腐蚀":
frm_ModuleObj.m_Emhan.Add(new GrayErosionr(this));
break;
case "灰度膨胀":
frm_ModuleObj.m_Emhan.Add(new GrayDilation(this));
break;
default:
break;
}
int index = dgv_Empha.SelectedIndex;
Refresh();
if (index < 0)
{
if (frm_ModuleObj.m_Emhan.Count > 0)
index = dgv_Empha.SelectedIndex = 0;
}
else
{
if (frm_ModuleObj.m_Emhan.Count > 0)
dgv_Empha.SelectedIndex = index + 1;
}
if (index > -1)
{
//显示控件窗体
Page_Change.Content = new Frame()
{
Content = frm_ModuleObj.m_Emhan[index].m_Control
};
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
Log.Error(frm_ModuleObj.ModuleParam.ModuleName + ":" + ex.ToString());
}
}