如何从 RibbonGroup 添加或删除项
How to add or remove item from RibbonGroup
我有一个功能区,其中有一些选项卡。在一个选项卡上,我有两个 RibbonGroups。我想要实现的是,当我单击位于 RibbonGroup 中的 RibbonMenuButton(第一个)时,我想将一些项目(例如其他 RibbonMenuButton)添加到 RibbonGroup no 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>
这是我的代码示例。我想要实现的是,当我从 "chartsGroup" RibbonGroup 单击 RibbonMenuItem 时,我想将项目(checkboxex、textboxes 等)添加到 chartsTools RibbonGroup。
由于要显示的控件总是相同的,最简单的方法是将它们添加到 XAML 并将它们的 Visibility
设置为 Collapsed
。
然后你可以使用 RibbonMenuButton.MouseLeftButtonUp
或 RibbonMenuButton.MouseLeftButtonDown
EventHandler 或使用 Command
模式(如果你使用 MVVM 或类似的东西)。
在 Command/EventHandler 中,然后将与所选 RibbonMenuButton
相关的控件的 Visibility
设置为 Visible
,将 Visibility
Collapsed
.
的不相关控件
在 MVVM 中,您必须将受影响控件的 Visibility
绑定到 ViewModel
上的某些内容,也许是布尔值(在这种情况下,您需要 boolean
/Visibility
转换器),并从 Command
.
中设置这些布尔值
如果您使用 ToggleButton
而不是那些 RibbonMenuButton
,您也可以直接将控件的 Visibility
绑定到 Toggled
状态负责ToggleButton
,当然你又需要一个转换器。或者绑定到 Enabled
状态,如果你想让它们变灰。
===================================
对于更模块化的方法,您有两种可能性:
- 沿用上述方法,但在将
Visibility
更改为Visible
时添加if
语句。我不确定您如何确定要启用哪些功能,但只要所有功能始终在主程序中并且您不想总是显示所有功能,那应该可以处理所有可能的情况。
- 使用依赖注入(最容易设置的可能是 MEF)。将 'extra' 方法及其 WPF 控件放在单独的 MEF 模块中。您还需要至少一个接口,最好将其放在第三个程序集中,然后由模块和您的主程序引用。在启动时使用
ImportMany
加载所有模块,然后使用 foreach
循环遍历该列表并从这些模块获取 WPF 控件。我认为您需要在接口中定义的两个或三个方法:
- 一种获取需要添加到
RibbonGroup
的实际功能区控件的方法
- 一个方法returns某物来确定那个控件去哪里(在哪个group/which位置),这可能需要分成两种方法,如果你想指定一个组和一个该组中的位置
- 可选:允许您为该模块设置当前对象的方法。因此,如果用户选择 he/she 想要处理的对象,则需要让每个模块知道它是哪个对象。要么让主程序在更改对象时在每个模块上设置该对象,要么创建由主程序实现的第二个接口,并在模块上为该接口使用
Import
。在模块的 eventhandler/command 中,您可以查询当前对象的主程序。
我有一个功能区,其中有一些选项卡。在一个选项卡上,我有两个 RibbonGroups。我想要实现的是,当我单击位于 RibbonGroup 中的 RibbonMenuButton(第一个)时,我想将一些项目(例如其他 RibbonMenuButton)添加到 RibbonGroup no 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>
这是我的代码示例。我想要实现的是,当我从 "chartsGroup" RibbonGroup 单击 RibbonMenuItem 时,我想将项目(checkboxex、textboxes 等)添加到 chartsTools RibbonGroup。
由于要显示的控件总是相同的,最简单的方法是将它们添加到 XAML 并将它们的 Visibility
设置为 Collapsed
。
然后你可以使用 RibbonMenuButton.MouseLeftButtonUp
或 RibbonMenuButton.MouseLeftButtonDown
EventHandler 或使用 Command
模式(如果你使用 MVVM 或类似的东西)。
在 Command/EventHandler 中,然后将与所选 RibbonMenuButton
相关的控件的 Visibility
设置为 Visible
,将 Visibility
Collapsed
.
在 MVVM 中,您必须将受影响控件的 Visibility
绑定到 ViewModel
上的某些内容,也许是布尔值(在这种情况下,您需要 boolean
/Visibility
转换器),并从 Command
.
如果您使用 ToggleButton
而不是那些 RibbonMenuButton
,您也可以直接将控件的 Visibility
绑定到 Toggled
状态负责ToggleButton
,当然你又需要一个转换器。或者绑定到 Enabled
状态,如果你想让它们变灰。
===================================
对于更模块化的方法,您有两种可能性:
- 沿用上述方法,但在将
Visibility
更改为Visible
时添加if
语句。我不确定您如何确定要启用哪些功能,但只要所有功能始终在主程序中并且您不想总是显示所有功能,那应该可以处理所有可能的情况。 - 使用依赖注入(最容易设置的可能是 MEF)。将 'extra' 方法及其 WPF 控件放在单独的 MEF 模块中。您还需要至少一个接口,最好将其放在第三个程序集中,然后由模块和您的主程序引用。在启动时使用
ImportMany
加载所有模块,然后使用foreach
循环遍历该列表并从这些模块获取 WPF 控件。我认为您需要在接口中定义的两个或三个方法:- 一种获取需要添加到
RibbonGroup
的实际功能区控件的方法
- 一个方法returns某物来确定那个控件去哪里(在哪个group/which位置),这可能需要分成两种方法,如果你想指定一个组和一个该组中的位置
- 可选:允许您为该模块设置当前对象的方法。因此,如果用户选择 he/she 想要处理的对象,则需要让每个模块知道它是哪个对象。要么让主程序在更改对象时在每个模块上设置该对象,要么创建由主程序实现的第二个接口,并在模块上为该接口使用
Import
。在模块的 eventhandler/command 中,您可以查询当前对象的主程序。
- 一种获取需要添加到