我决定尝试自定义Menu和MenuItem的默认控件模板的多个方面。在Visual Studio中,我选择了我的菜单,找到了'模板'在属性面板中,选择“转换为新资源...”。
我为MenuItem做了同样的事情。然后,为了测试,我将MenuItem SubMenuBorder颜色更改为红色。此时,我有一个包含两个ControlTemplates的资源字典,以及一个看起来像这样的菜单:
<Menu Template="{DynamicResource CustomMenuControlTemplate}">
<MenuItem Header="File" Template="{DynamicResource CustomMenuItemControlTemplate}">
<MenuItem Header="Test 1" />
<MenuItem Header="Test 2">
<MenuItem Header="Subtest 1" />
<MenuItem Header="Subtest 2" />
<MenuItem Header="Subtest 3" />
</MenuItem>
<MenuItem Header="Test 3" />
</MenuItem>
</Menu>
问题是红色边框只会出现在MenuItems上,我将模板显式设置为我修改过的CustomMenuItemControlTemplate。如果我想在所有菜单项上使用我的模板,我必须包括:
Template="{DynamicResource CustomMenuItemControlTemplate}"
...在我的整个应用程序中的每个MenuItem上。
所以,接下来我认为我的样式适用于所有MenuItems,并使用setter设置我的默认模板:
<Style TargetType="MenuItem">
<Setter Property="Template" Value="{DynamicResource CustomMenuItemControlTemplate}" />
</Style>
这有效(注意所有子菜单上的红色边框),但由于某种原因,它会彻底改变菜单的外观:
在那个setter中,我尝试使用DynamicResource和StaticResource绑定,结果相同。
所以,我的主要问题是:有没有办法使用自定义ControlTemplate作为默认值,这样我就不必在每个控件上明确设置它?次要问题:为什么使用样式设置模板属性会导致其外观发生如此剧烈的变化?
答案 0 :(得分:3)
回答你的第一个问题:
如果您将ControlTemplate放在app.xaml的资源字典中,它将应用于整个应用程序。您的控件模板标题应该是这样的:
<ControlTemplate TargetType="MenuItem" ...(other properties)>
这将使所有MenuItem控件隐式使用该控件模板。
回答第二个问题:
这是因为添加样式会覆盖默认样式,基本上会删除所有内置样式。如果您希望样式只更改一些内容,样式标记应如下所示:
<Style BasedOn="{StaticResource {x:Type MenuItem}}" ...(other properties)>
这样它就会继承所有正常的样式,只是改变你明确定义的样式
答案 1 :(得分:1)
因此,您不能在没有密钥的情况下放置控件模板,并且密钥不能在WPF中为{x:Type ...}
。
但是您可以将Style
放在不带键的位置,并且该样式将是默认样式。 -并以该样式设置控件模板。
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<!-- Insert Control Template Here -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>