如何将自定义Controltemplate设置为整个应用程序的默认值?

时间:2016-03-09 19:29:52

标签: wpf controltemplate

我决定尝试自定义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>

Menu 1

问题是红色边框只会出现在MenuItems上,我将模板显式设置为我修改过的CustomMenuItemControlTemplate。如果我想在所有菜单项上使用我的模板,我必须包括:

Template="{DynamicResource CustomMenuItemControlTemplate}"

...在我的整个应用程序中的每个MenuItem上。

所以,接下来我认为我的样式适用于所有MenuItems,并使用setter设置我的默认模板:

<Style TargetType="MenuItem">
    <Setter Property="Template" Value="{DynamicResource CustomMenuItemControlTemplate}" />
</Style>

这有效(注意所有子菜单上的红色边框),但由于某种原因,它会彻底改变菜单的外观:

Menu 2

在那个setter中,我尝试使用DynamicResource和StaticResource绑定,结果相同。

所以,我的主要问题是:有没有办法使用自定义ControlTemplate作为默认值,这样我就不必在每个控件上明确设置它?次要问题:为什么使用样式设置模板属性会导致其外观发生如此剧烈的变化?

2 个答案:

答案 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>