我正在尝试对复选框的默认模板进行一些小调整。现在我了解如何从头开始制作新模板,但我不知道。我确实设法(我认为?)通过方法here提取默认模板。
它吐了出来:
<ControlTemplate TargetType="CheckBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna">
<BulletDecorator Background="#00FFFFFF" SnapsToDevicePixels="True">
<BulletDecorator.Bullet>
<mwt:BulletChrome Background="{TemplateBinding Panel.Background}"
BorderBrush="{TemplateBinding Border.BorderBrush}"
BorderThickness="{TemplateBinding Border.BorderThickness}"
RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}"
RenderPressed="{TemplateBinding ButtonBase.IsPressed}"
IsChecked="{TemplateBinding ToggleButton.IsChecked}" />
</BulletDecorator.Bullet>
<ContentPresenter RecognizesAccessKey="True"
Content="{TemplateBinding ContentControl.Content}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
Margin="{TemplateBinding Control.Padding}"
HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</BulletDecorator>
<ControlTemplate.Triggers>
<Trigger Property="ContentControl.HasContent">
<Setter Property="FrameworkElement.FocusVisualStyle">
<Setter.Value>
<Style TargetType="IFrameworkInputElement">
<Style.Resources>
<ResourceDictionary />
</Style.Resources>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Stroke="#FF000000"
StrokeThickness="1"
StrokeDashArray="1 2"
Margin="14,0,0,0"
SnapsToDevicePixels="True" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Control.Padding">
<Setter.Value>
<Thickness>2,0,0,0</Thickness>
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>True</s:Boolean>
</Trigger.Value>
</Trigger>
<Trigger Property="UIElement.IsEnabled">
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>False</s:Boolean>
</Trigger.Value>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
好的,当然,我觉得看起来很好。我没有足够的经验来知道它是否正确。现在,我得到两个错误:
汇编'PresentationFramework.Luna' 没找到。确认您不是 缺少装配参考。也, 验证您的项目和所有 引用的程序集已经构建。
和
'mwt:BulletChrome'类型不是 找到。确认您没有遗漏 汇编参考和所有 引用的程序集已经构建。
现在我想知道,如何解决这些错误,以便我可以真正开始处理模板?有没有更好的方法来解决这个问题?我的老板想要一个带有红色方块而不是绿色的三态复选框,他不会拒绝回答。
答案 0 :(得分:2)
要解决这两个错误,请添加对PresentationFramework.Luna的引用(它位于GAC中,因此在VS中选择“添加引用”时,您将在.NET选项卡中找到它。)
但请注意,如果Windows XP主题为Luna(默认值),则默认情况下仅使用Luna主题。如果您在显示设置中更改主题,则复选框将保留Luna主题,因为您正在重复使用Luna模板。
如果首先没有设计所述模板,则没有其他方法可以仅编辑现有模板的一部分。
答案 1 :(得分:2)
修改现有模板部分的唯一方法是完全覆盖(复制)它。您可以使用表达式Blend(编辑模板 - >编辑副本)轻松完成此操作(它将立即编译 - 无需手动引用任何内容)。
有一件事你必须要记住ControlTemplates:
每个 已知的 操作系统主题(Luna,Aero等)都有一个单独的ControlTemplate,因此控件在每个操作系统主题下看起来都是正确的。如果你覆盖它,则不再是这种情况,并且在每个操作系统下的每个主题下它总是看起来相同。在你的情况下,它总是看起来像Windows XP Luna(因为你选择了Luna ControlTemplate作为起点),即使你在Vista,Win7或Battleship-Grey-Theme上运行你的应用程序。
因此,在某种程度上,最重要的ControlTemplates在设计上存在缺陷。当然,您可以自己为每个已知的操作系统主题提供一个ControlTemplate,但如果有新的主题进入则无法帮助。
答案 2 :(得分:0)
Windows SDK中是否包含所有控件模板的完整副本?