3

以下是场景:

当功能区最小化时,显示链接到的选项卡可以RibbonContextualTabGroup正常工作,如以下屏幕截图所示。

普通色带

当功能区最小化时,显示链接到 aRibbonContextualTabGroup的选项卡会显示选项卡,但不会显示上下文选项卡组标题,如以下屏幕截图所示。

最小化功能区

如果功能区已最小化,但弹出窗口已打开,则显示链接到RibbonContextualTabGroup工作正常的选项卡,如以下屏幕截图所示。(弹出窗口不可见,但这就是我创建场景的方式。)

带打开弹出窗口的最小化功能区

WebMatrix 也有这个问题,所以我假设微软开发人员有意在这个功能中编码。但是,在 Windows 8/Office 2013 中,上下文选项卡组始终显示,无论功能区的状态如何。

我正在使用 Microsoft 的 .NET 4.0 RibbonControlsLibrary,因此我可以访问完整的源代码。无论功能区的状态如何,如何修改代码以强制始终显示上下文选项卡组?

4

3 回答 3

2

我有同样的问题,并找到了这个解决方法。

  1. 在拥有功能区的窗口中覆盖 OnApplyTemplate 方法以获取 RibbonContextualTabGroupItemsControl 并设置内部字段:

  2. 将功能区的 IsMinimized-property 设置为 true,然后将上下文组的可见性设置为可见,然后调用 RibbonContextualTabGroupItemsControl 的 UpdateLayout 并将功能区的 IsMinimized-Property 重置为 false:

代码

...
RibbonContextualTabGroupItemsControl _ribbonContextualTabGroupItemsControl;
...  

public override void OnApplyTemplate()  
{  
    base.OnApplyTemplate();  
    Ribbon ribbon = this.ribbon;  
    ribbon.ApplyTemplate();  
    this._ribbonContextualTabGroupItemsControl = ribbon.Template.FindName("PART_ContextualTabGroupItemsControl", ribbon) as RibbonContextualTabGroupItemsControl;  
}  

...  

void toggleRibbonContextualGroupVisibility()  
{  
    if(this.ribbonContextualGroup.Visibility == Visibility.Collapsed)  
    {
        if (this.ribbon.IsMinimized)  
        {  
            this.ribbon.IsMinimized = false;  
            this.ribbonContextualGroup.Visibility = Visibility.Visible;  
            this._ribbonContextualTabGroupItemsControl.UpdateLayout();  
            this.ribbon.IsMinimized = true;  
        }  
        else  
        {  
            this.ribbonContextualGroup.Visibility = Visibility.Visible;  
        }  
    }
    else  
    {  
        this.ribbonContextualGroup.Visibility = Visibility.Collapsed;
    }
}  

...  

我也尝试过覆盖 RibbonContextualTabGroupItemsControl-class 和 Ribbon-style 但没有成功。
如果还有其他解决方案,我真的很感兴趣。

于 2014-01-26T14:22:42.950 回答
2

是的,真的很好,非常感谢你,Ming!

有没有办法使用 RibbonContextualTabGroupItemsControl.cs 而不复制和覆盖所有相关的功能区源类?

我再次采用了覆盖功能区样式的方法来避免这项广泛的工作并最终成功

有一个触发器可以处理功能区的 IsMinimized-property:

<Trigger Property="IsMinimized" Value="True">
    <Setter Property="Content" TargetName="mainItemsPresenterHost" Value="{x:Null}"/>
    <Setter Property="Visibility" TargetName="mainItemsPresenterHost" Value="Collapsed"/>
    <Setter Property="Content" TargetName="popupItemsPresenterHost" Value="{Binding ElementName=groupsBorder}"/>
    <Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0,0,0,1"/>
</Trigger>

mainItemsPresenterHost-control 的内容是一个名为“groupsBorder”的边框,其中包含所有功能区选项卡。当 IsMinimized-property 更改为 true 时,此边框将移动到名为“popupItemsPresenterHost”的弹出演示者。

另一个触发器处理 IsDropDownOpen 属性:

<Trigger Property="IsDropDownOpen" Value="True">
    <Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0"/>
/Trigger>

我改变了两个触发器如下:

<Trigger Property="IsMinimized" Value="True">
    <!--<Setter Property="Content" TargetName="mainItemsPresenterHost" Value="{x:Null}"/>-->
    <!--<Setter Property="Visibility" TargetName="mainItemsPresenterHost" Value="Collapsed"/>-->
    <Setter Property="Height" TargetName="mainItemsPresenterHost" Value="0"/>
    <!--<Setter Property="Content" TargetName="popupItemsPresenterHost" Value="{Binding ElementName=groupsBorder}"/>-->
    <Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0,0,0,1"/>
</Trigger>

<Trigger Property="IsDropDownOpen" Value="True">
    <Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0,0,0,1"/>
    <Setter Property="Content" TargetName="mainItemsPresenterHost" Value="{x:Null}"/>
    <Setter Property="Content" TargetName="popupItemsPresenterHost" Value="{Binding ElementName=groupsBorder}"/>
</Trigger>

请注意,我已将 mainItemsPresenterHost-control 的 Visibility-property 设置器替换为 Height-property,并将其设置为“0”。

于 2014-02-02T06:29:52.503 回答
2

在玩弄了 RibbonControlsLibrary 的源文件,并且只是进行了硬核试验和错误之后,我找到了以下解决方案:

打开位于 Microsoft/Windows/Controls/Ribbon 的 RibbonContextualTabGroupItemsControl.cs,展开 Private Methods #region,然后找到 HasTabs 函数。代码应如下所示:

private bool HasTabs(FrameworkElement container)
{
    RibbonContextualTabGroup tabGroupHeader = container as RibbonContextualTabGroup;
    if (tabGroupHeader == null ||
        !tabGroupHeader.IsVisible)
    {
        return false;
    }

    foreach (RibbonTab tab in tabGroupHeader.Tabs)
    {
        if (tab != null && tab.IsVisible)
        {
            return true;
        }
    }
    return false;
}

我只添加了以下两行代码:

if (Ribbon.IsMinimized)
    return true;

该函数现在应该如下所示:

private bool HasTabs(FrameworkElement container)
{
    RibbonContextualTabGroup tabGroupHeader = container as RibbonContextualTabGroup;
    if (tabGroupHeader == null ||
        !tabGroupHeader.IsVisible)
    {
        return false;
    }

    if (Ribbon.IsMinimized)
        return true;

    foreach (RibbonTab tab in tabGroupHeader.Tabs)
    {
        if (tab != null && tab.IsVisible)
        {
            return true;
        }
    }
    return false;
}

运行您的应用程序,瞧,即使功能区已最小化,上下文选项卡组现在也会显示。

请注意,如果您无法访问功能区源代码,那么使用 zznobody 的解决方案仍然可以在紧要关头工作。

于 2014-01-28T21:05:12.537 回答