C# 是否有方法编辑控件';基于默认模板的模板?

C# 是否有方法编辑控件';基于默认模板的模板?,c#,wpf,xaml,wpf-controls,C#,Wpf,Xaml,Wpf Controls,我正在尝试对复选框的默认模板进行一些小的调整。现在我明白了如何从头开始制作一个新的模板,但这个我不知道。我确实设法(我想?)通过该方法提取了默认模板 它吐出: <ControlTemplate TargetType="CheckBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-n

我正在尝试对复选框的默认模板进行一些小的调整。现在我明白了如何从头开始制作一个新的模板,但这个我不知道。我确实设法(我想?)通过该方法提取了默认模板

它吐出:

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

2,0,0,0
真的
假的
好的,当然,我想看起来很好。我没有足够的经验知道这看起来是否正确。现在,我有两个错误:

程序集“PresentationFramework.Luna” 找不到。请确认您不是 缺少程序集引用。也, 验证您的项目和所有 已生成引用的程序集

“mwt:BulletChrome”类型不是 建立确认你没有失踪 一个程序集引用和所有 已生成引用的程序集


现在我想知道,如何解决这些错误,以便我可以真正开始使用模板?有没有更好的办法?我的老板想要一个带有红方块而不是绿色的三状态复选框,他不会接受否定的回答。

要解决这两个错误,请添加对PresentationFramework.Luna的引用(它位于GAC中,因此在VS中选择“添加引用”时,您可以在.NET选项卡中找到它)

但是,请注意,只有当windows XP主题为Luna(默认主题)时,才会默认使用Luna主题。如果在显示设置中更改主题,则复选框将保留Luna主题,因为您正在重用Luna模板


如果所述模板最初没有设计成这样,则没有其他方法仅编辑现有模板的一部分

若要解决这两个错误,请添加对PresentationFramework.Luna的引用(它位于GAC中,因此在VS中选择“添加引用”时,您可以在.NET选项卡中找到它)

但是,请注意,只有当windows XP主题为Luna(默认主题)时,才会默认使用Luna主题。如果在显示设置中更改主题,则复选框将保留Luna主题,因为您正在重用Luna模板


如果所述模板最初没有设计成这样,则没有其他方法仅编辑现有模板的一部分

修改现有模板部分的唯一方法是完全覆盖(复制)它。您可以使用ExpressionBlend(编辑模板->编辑副本)轻松地完成此操作(它将立即编译-无需手动引用任何内容)

对于ControlTemplates,您必须记住一件事:

每个已知的操作系统主题(Luna、Aero等)都有一个单独的控件模板,因此每个操作系统主题下的控件看起来都是正确的。如果覆盖它,情况就不再是这样了,它在每个操作系统的每个主题下看起来总是一样的。在您的情况下,即使您在Vista、Win7或战舰灰色主题中运行应用程序,它也将始终看起来像Windows XP Luna(因为您选择了Luna ControlTemplate作为起点)


因此,在某种程度上,覆盖ControlTemplates的设计是有缺陷的。当然,您可以自己为每个已知的操作系统主题提供一个ControlTemplate,但如果有新的主题出现,这将无济于事。

修改现有模板部分的唯一方法是完全覆盖(复制)它。您可以使用ExpressionBlend(编辑模板->编辑副本)轻松地完成此操作(它将立即编译-无需手动引用任何内容)

对于ControlTemplates,您必须记住一件事:

每个已知的操作系统主题(Luna、Aero等)都有一个单独的控件模板,因此每个操作系统主题下的控件看起来都是正确的。如果覆盖它,情况就不再是这样了,它在每个操作系统的每个主题下看起来总是一样的。在您的情况下,即使您在Vista、Win7或战舰灰色主题中运行应用程序,它也将始终看起来像Windows XP Luna(因为您选择了Luna ControlTemplate作为起点)


因此,在某种程度上,覆盖ControlTemplates的设计是有缺陷的。你当然可以,为每个已知的操作系统主题自己提供一个控件模板,但如果有新的主题出现,这将不会有帮助。

是否有Windows SDK中包含的所有控件模板的完整副本?

是否有Windows SDK中包含的所有控件模板的完整副本?

我可以取消复选框“不合主题”。最重要的是我只想把那个盒子改成红色!我很乐意让我的复选框变成“不合主题”。最重要的是我只想把那个盒子改成红色!