如何在功能区组中添加或删除项目

本文关键字:添加 删除项目 功能区 | 更新日期: 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.MouseLeftButtonUpRibbonMenuButton.MouseLeftButtonDown事件处理程序,或者使用Command模式(如果您使用的是 MVVM 或类似的东西)。

然后,在

命令/事件处理程序中,将与所选RibbonMenuButton相关的控件的Visibility设置为Visible,并将不相关控件的Visibility设置为Collapsed

在 MVVM 中,您必须将受影响控件的Visibility绑定到ViewModel上的某些内容,也许是一个布尔值(在这种情况下,您需要一个 boolean/Visibility 转换器),并从您的Command中设置这些布尔值。

如果您使用的是ToggleButton而不是那些RibbonMenuButton,您还可以直接将控件的Visibility绑定到负责ToggleButtonToggled状态,当然您需要再次使用转换器。或者绑定到Enabled状态,如果你宁愿让它们灰显。

====

==================================

对于更加模块化的方法,您有两种可能性:

  1. 使用上述方法,但在将Visibility更改为 Visible 时添加if语句。我不确定您如何确定要启用哪些功能,但只要所有功能始终在主程序中并且您不想总是显示所有功能,这应该可以处理所有可能的情况。
  2. 使用依赖注入(最容易设置的可能是 MEF)。将"额外"方法及其 WPF 控件放在单独的 MEF 模块中。您还需要至少一个接口,最好将其放在第三个程序集中,然后由模块和主程序引用。启动时,使用 ImportMany 加载所有模块,然后通过 foreach 循环遍历该列表,并从这些模块获取 WPF 控件。我认为您需要在界面中定义的两个或三个方法:
    • 获取需要添加到RibbonGroup的实际功能区控件的一种方法
    • 一种返回某些内容以确定控件去向(在哪个组/哪个位置)的方法,如果要指定组和该组内的位置,则可能需要将其拆分为两个方法
    • 可选:允许您设置该模块的当前对象的方法。因此,如果用户选择他/她想要处理的对象,则需要让每个模块知道这是哪个对象。要么让主程序在更改对象时在每个模块上设置该对象,要么创建由主程序实现的第二个接口,并在该接口的模块上使用Import。在模块的事件处理程序/命令中,您可以查询主程序的当前对象。