碰巧我正在处理的应用程序不对文档进行操作,因此无需在应用程序菜单中显示最近打开的文档列表。
但是 - 令人讨厌的是 - RibbonApplicationMenu
类中没有可用的属性来隐藏未使用的AuxiliaryPane
(奇怪的是,该属性确实存在,但标记为“内部”)。
当然,我可以把它留在那里 - 但那是......不整洁。
所以,这是我提出的解决方案。
希望它对其他人有用:-)
一般的想法是继承RibbonApplicationMenu
,找到对应于菜单弹出窗口的模板子项,并否决它的Width
(经过一系列令人沮丧的实验后,很明显这样做对{ {1}}也不是PART_AuxiliaryPaneContentPresenter
- 也不是两者 - 都可以实现任何目标。
好吧,不用多说了,这是代码:
PART_FooterPaneContentPresenter
作为旁注,我试图找到任何方法来根据ApplicationMenu的项目的最大宽度来解析所需的宽度(而不是通过XAML中的DependencyProperty显式设置它) - 但无济于事。
鉴于我对“魔术数字”的鄙视,对 的任何建议都将深表赞赏。
答案 0 :(得分:2)
我知道这已经有一段时间了,但我还有另一个解决方案。这个不提供Popup width属性,而是提供ShowAuxilaryPanel布尔值。然后,它将弹出窗口的宽度绑定到菜单的菜单项区域的宽度。
public class SlimRibbonApplicationMenu : RibbonApplicationMenu
{
public bool ShowAuxilaryPanel
{
get { return (bool)GetValue(ShowAuxilaryPanelProperty); }
set { SetValue(ShowAuxilaryPanelProperty, value); }
}
public static readonly DependencyProperty ShowAuxilaryPanelProperty =
DependencyProperty.Register("ShowAuxilaryPanel", typeof(bool),
typeof(SlimRibbonApplicationMenu), new UIPropertyMetadata(true));
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.DropDownOpened += SlimRibbonApplicationMenu_DropDownOpened;
}
void SlimRibbonApplicationMenu_DropDownOpened(object sender, EventArgs e)
{
DependencyObject popupObj = base.GetTemplateChild("PART_Popup");
Popup panel = (Popup)popupObj;
var exp = panel.GetBindingExpression(Popup.WidthProperty);
if (!this.ShowAuxilaryPanel && exp == null)
{
DependencyObject panelArea = base.GetTemplateChild("PART_SubMenuScrollViewer");
var panelBinding = new Binding("ActualWidth")
{
Source = panelArea,
Mode = BindingMode.OneWay
};
panel.SetBinding(Popup.WidthProperty, panelBinding);
}
else if (this.ShowAuxilaryPanel && exp != null)
{
BindingOperations.ClearBinding(panel, Popup.WidthProperty);
}
}
}
答案 1 :(得分:-2)
为我工作
<telerik:ApplicationMenu RightPaneVisibility="Collapsed" >