我决定尝试自定义菜单和菜单项的默认控件模板的多个方面。在Visual Studio中,我选择了我的菜单,在属性面板中找到“Template”,并选择“转换为新资源...”。
我对MenuItem做了同样的事情。然后,只是为了测试,我将MenuItem SubMenuBorder颜色改为红色。此时,我有了一个包含两个ControlTemplates的资源字典,以及一个看起来像这样的菜单:
这个可以工作(请注意所有子菜单上的红色边框),但出于某种原因,它会极大地改变菜单的外观: 在那个setter中,我尝试使用DynamicResource和StaticResource绑定,结果相同。
所以,我的主要问题是:有没有办法将自定义ControlTemplate用作默认值,这样我就不必在每个控件上显式设置它了?次要问题:为什么使用样式来设置模板属性会导致外观发生如此巨大的变化?
我对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>
问题在于,只有在我明确将模板设置为修改后的CustomMenuItemControlTemplate时,红色边框才会出现在菜单项上。如果我想在所有菜单项上使用我的模板,我必须包含以下内容:Template="{DynamicResource CustomMenuItemControlTemplate}"
我希望在我的整个应用程序中为每个菜单项设置命令。
因此,接下来我想创建一个适用于所有菜单项的样式,并使用setter设置默认模板:
<Style TargetType="MenuItem">
<Setter Property="Template" Value="{DynamicResource CustomMenuItemControlTemplate}" />
</Style>
这个可以工作(请注意所有子菜单上的红色边框),但出于某种原因,它会极大地改变菜单的外观: 在那个setter中,我尝试使用DynamicResource和StaticResource绑定,结果相同。
所以,我的主要问题是:有没有办法将自定义ControlTemplate用作默认值,这样我就不必在每个控件上显式设置它了?次要问题:为什么使用样式来设置模板属性会导致外观发生如此巨大的变化?