首页 文章

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

提问于
浏览
2

我决定尝试自定义Menu和MenuItem的默认控件模板的许多方面 . 在Visual Studio中,我选择了我的菜单,在属性面板中找到了“模板”,然后选择了“转换为新资源...” .

我为MenuItem做了同样的事情 . 然后,为了测试,我将MenuItem SubMenuBorder颜色更改为红色 . 此时,我有一个包含两个ControlTemplates的资源字典,以及一个如下所示的Menu:

<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上 .

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

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

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

Menu 2

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

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

1 回答

  • 3

    回答你的第一个问题:

    如果将ControlTemplate放在app.xaml的资源字典中,它将应用于整个应用程序 . 你的控件模板头应该是这样的:

    <ControlTemplate TargetType="MenuItem" ...(other properties)>
    

    这将使所有MenuItem控件隐式使用该控件模板 .

    为了回答你的第二个问题:

    发生这种情况是因为添加样式会覆盖默认样式,从而基本上删除所有内置样式 . 如果您希望样式只更改一些内容,则样式标记应如下所示:

    <Style BasedOn="{StaticResource {x:Type MenuItem}}" ...(other properties)>
    

    这样它就会继承所有正常的样式,只是改变你明确定义的样式

相关问题