以下是该方案:
当功能区未最小化时,显示链接到RibbonContextualTabGroup
的标签可正常工作,如以下屏幕截图所示。
当功能区 最小化时,显示链接到RibbonContextualTabGroup
的标签会显示标签,但不显示上下文标签组标题,如以下屏幕截图所示。
如果功能区最小化,但弹出窗口已打开,则显示链接到RibbonContextualTabGroup
的选项卡可以正常工作,如以下屏幕截图所示。 (弹出窗口不可见,但这就是我创建场景的方式。)
WebMatrix也有这个问题,所以我假设微软开发人员故意编写了这个功能。但是,在Windows 8 / Office 2013中,无论功能区的状态如何,上下文选项卡组始终都会显示。
我正在使用Microsoft的.NET 4.0 RibbonControlsLibrary,因此我可以访问完整的源代码。无论功能区的状态如何,如何修改代码以强制上下文选项卡组始终显示?
答案 0 :(得分:1)
我遇到了同样的问题并找到了解决方法。
在拥有功能区的窗口中重写OnApplyTemplate方法以获取RibbonContextualTabGroupItemsControl并设置内部字段:
在将上下文组的可见性设置为visible之前,将功能区的IsMinimized属性设置为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但没有成功。
如果还有其他解决方案,我真的很感兴趣。
答案 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”。