如何在功能区组中添加或删除项目
本文关键字:添加 删除项目 功能区 | 更新日期: 2023-09-27 18:36:05
我有一个功能区,其中有某种选项卡。在一个选项卡上,我有两个功能区组。我想要实现的是,当我单击位于功能区组中的功能区菜单按钮(第一个)时,我想将一些项目(例如其他功能区菜单按钮)添加到功能区组 2 号。如何使用 C# 实现此目的?
<Custom:Ribbon Name="RibbonMenu" HorizontalAlignment="Stretch" VerticalAlignment="Top" Loaded="RibbonLoaded" Grid.Row="0">
<Custom:Ribbon.ApplicationMenu>
<Custom:RibbonApplicationMenu KeyTip="F">
</Custom:RibbonApplicationMenu>
</Custom:Ribbon.ApplicationMenu>
<Custom:RibbonTab Header="Home" KeyTip="H" >
<Custom:RibbonGroup x:Name="ClipboardGroup" Header="Home">
</Custom:RibbonGroup>
<Custom:RibbonGroup x:Name="ConnectionGroup" Header="Connect">
</Custom:RibbonGroup>
</Custom:RibbonTab>
<Custom:RibbonTab Header="Script">
<Custom:RibbonGroup x:Name="ScriptsGroup" Header="Scripts">
</Custom:RibbonGroup>
</Custom:RibbonTab>
<Custom:RibbonTab Header="Charts">
<Custom:RibbonGroup x:Name="chartsGroup" Header="Charts">
<Custom:RibbonMenuButton Label="First Chart" Name="firstChart" LargeImageSource="Resources/chartIco.png" PreviewMouseLeftButtonDown="firstChart_MouseLeftButtonDown"/>
<Custom:RibbonMenuButton Label="Second Chart" Name="secondChart" LargeImageSource="Resources/chartIco.png" PreviewMouseLeftButtonDown="secondChart_MouseLeftButtonDown"/>
</Custom:RibbonGroup>
<Custom:RibbonGroup x:Name="chartsTools" Header="Tools">
</Custom:RibbonGroup>
</Custom:RibbonTab>
</Custom:Ribbon>
这是我的代码示例。我想要实现的是,当我单击RibbonMenuItem fron "chartsGroup" RibbonGroup时,我想将项目(checkboxex,textbox etx.)添加到chartsTools RibbonGroup。
由于要显示的控件始终相同,因此最简单的方法是将它们添加到 XAML 中并将其Visibility
设置为 Collapsed
。
然后,您可以使用RibbonMenuButton.MouseLeftButtonUp
或RibbonMenuButton.MouseLeftButtonDown
事件处理程序,或者使用Command
模式(如果您使用的是 MVVM 或类似的东西)。
命令/事件处理程序中,将与所选RibbonMenuButton
相关的控件的Visibility
设置为Visible
,并将不相关控件的Visibility
设置为Collapsed
。
在 MVVM 中,您必须将受影响控件的Visibility
绑定到ViewModel
上的某些内容,也许是一个布尔值(在这种情况下,您需要一个 boolean
/Visibility
转换器),并从您的Command
中设置这些布尔值。
如果您使用的是ToggleButton
而不是那些RibbonMenuButton
,您还可以直接将控件的Visibility
绑定到负责ToggleButton
的Toggled
状态,当然您需要再次使用转换器。或者绑定到Enabled
状态,如果你宁愿让它们灰显。
====
==================================对于更加模块化的方法,您有两种可能性:
- 使用上述方法,但在将
Visibility
更改为Visible
时添加if
语句。我不确定您如何确定要启用哪些功能,但只要所有功能始终在主程序中并且您不想总是显示所有功能,这应该可以处理所有可能的情况。 - 使用依赖注入(最容易设置的可能是 MEF)。将"额外"方法及其 WPF 控件放在单独的 MEF 模块中。您还需要至少一个接口,最好将其放在第三个程序集中,然后由模块和主程序引用。启动时,使用
ImportMany
加载所有模块,然后通过foreach
循环遍历该列表,并从这些模块获取 WPF 控件。我认为您需要在界面中定义的两个或三个方法:- 获取需要添加到
RibbonGroup
的实际功能区控件的一种方法 - 一种返回某些内容以确定控件去向(在哪个组/哪个位置)的方法,如果要指定组和该组内的位置,则可能需要将其拆分为两个方法
- 可选:允许您设置该模块的当前对象的方法。因此,如果用户选择他/她想要处理的对象,则需要让每个模块知道这是哪个对象。要么让主程序在更改对象时在每个模块上设置该对象,要么创建由主程序实现的第二个接口,并在该接口的模块上使用
Import
。在模块的事件处理程序/命令中,您可以查询主程序的当前对象。
- 获取需要添加到