为什么应用此样式时我的功能区菜单按钮弹出窗口消失?

时间:2018-08-23 12:53:26

标签: wpf xaml popup styles ribbon

这是我的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:Namex: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。”

1 个答案:

答案 0 :(得分:1)

while true; do echo '"ping"'|nc localhost 9119; done 方法具有一些here提及的序列化限制。其中之一就是那个;

  

由各种标记扩展格式(例如StaticResource或Binding)构成的对象的公共引用将在序列化过程中取消引用。在应用程序运行时创建内存中对象时,这些对象已经被取消引用,并且Save逻辑不会重新访问原始XAML来将此类引用还原到序列化输出。

因此,您生成的模板缺少XamlWriter.Save的{​​{1}}属性的TemplateBinding

IsOpen

您可以使用反编译器(例如dotPeek)从Popup提取包括所有绑定的默认模板。