功能区最小化时显示功能区上下文选项卡组

时间:2014-01-04 20:11:05

标签: c# wpf .net-4.0 ribboncontrolslibrary

以下是该方案:

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

Normal Ribbon

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

Minimized Ribbon

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

Minimized Ribbon w/Open Popup

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

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

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并找到了解决方法。

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

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

  3. 代码

    ...
    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但没有成功。
    如果还有其他解决方案,我真的很感兴趣。

答案 1 :(得分:1)

在玩了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的解决方案仍然可以解决问题。

答案 2 :(得分:1)

是的,真的很好,非常感谢,明!

有没有办法使用RibbonContextualTabGroupItemsControl.cs而无需复制和覆盖所有相关的ribbon-source-classes?

我再次采用覆盖色带样式的方法来避免这种广泛的工作并最终成功

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

<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属性更改为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>

请注意,我已使用Height属性替换了mainItemsPresenterHost-control的Visibility属性的setter,并将其设置为“0”。