这是我的XAML:
<Ribbon x:Name="ribbonMain" Height="200" ContextMenu="{x:Null}" VerticalAlignment="Top" ShowQuickAccessToolBarOnTop="False" >
<RibbonTab x:Name="ribbonTabMain" Header="Test Tab" ContextMenu="{x:Null}" >
<RibbonGroup x:Name="ribbonGroupMain" Header="Test Group" ContextMenu="{x:Null}">
<RibbonButton x:Name="ribbonButtonMain" Label="Test Button" ContextMenu="{x:Null}" />
</RibbonGroup>
<RibbonGroup x:Name="ribbonGroupMain2" Header="Test Group 2" ContextMenu="{x:Null}">
<RibbonMenuButton ContextMenu="{x:Null}" Name="ribbonMenuButtonMain" Label="Menu Button">
<RibbonMenuItem ContextMenu="{x:Null}" Name="ribbonMenuItemMain" Header="Menu Item"></RibbonMenuItem>
<RibbonMenuItem ContextMenu="{x:Null}" Name="ribbonMenuItemMain2" Header="Menu Item 2"></RibbonMenuItem>
</RibbonMenuButton>
</RibbonGroup>
</RibbonTab>
</Ribbon>
然后我运行此C#代码以获取功能区菜单按钮默认控制模板:
string ribbonMenuButtonControlTemplate = XamlWriter.Save(ribbonMenuButtonMain.Template);
此后,我将控制模板的x:Name
和x:Key
属性设置为某些内容,然后将XAML字符串放入其中:
<Style TargetType="RibbonMenuButton"
<Setter Property="Template">
<Setter.Value>
{DefaultControlTemplateHere}
</Setter.Value>
</Setter>
</Style>
最后我把那个Style
放到了<Window.Resources>
中。
我想从那里更改Style
,但是后来我意识到弹出窗口不再起作用了。
我期望什么都不会改变。似乎我弄错了。
为什么会这样?
注意:
我尝试运行此代码以查看弹出窗口是否会打开:
if (!ribbonMenuButtonMain.IsDropDownOpen)
{
ribbonMenuButtonMain.IsDropDownOpen = true;
}
在未应用Style
的情况下,代码可以正常运行,并打开弹出窗口。
但是有了Style
,我得到了这个异常:
System.InvalidOperationException:'此视觉未连接到 PresentationSource。”
答案 0 :(得分:1)
while true; do echo '"ping"'|nc localhost 9119; done
方法具有一些here提及的序列化限制。其中之一就是那个;
由各种标记扩展格式(例如StaticResource或Binding)构成的对象的公共引用将在序列化过程中取消引用。在应用程序运行时创建内存中对象时,这些对象已经被取消引用,并且Save逻辑不会重新访问原始XAML来将此类引用还原到序列化输出。
因此,您生成的模板缺少XamlWriter.Save
的{{1}}属性的TemplateBinding
:
IsOpen
您可以使用反编译器(例如dotPeek)从Popup
提取包括所有绑定的默认模板。