以嵌套样式设置RenderTransform

时间:2014-12-23 23:03:54

标签: wpf xaml .net-3.5 styling

我在Windows 8上使用.Net 3.5,使用默认的Aero主题。

这应该是Scale Checkbox without scaling content的答案,但它没有像我预期的那样容易。我想:

  1. 在复选框控件中缩放框
  2. 在一个样式中,所以我可以将更改应用于所有复选框(或仅一些)
  3. 独立于其文本,无需补偿。
  4. 我有一个 UserControl 与此资源:

    <UserControl.Resources>
        <ResourceDictionary>
            <!-- ... -->
    
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Resources/CheckBoxStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    

    Resources / CheckBoxStyle.xaml 是这样的:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework">
        <Style TargetType="{x:Type CheckBox}">
            <Style.Resources>
                <Style TargetType="{x:Type BulletDecorator}">
                    <Setter Property="RenderTransform">
                        <Setter.Value>
                            <ScaleTransform ScaleX="2" ScaleY="2"/>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Style.Resources>
        </Style>
    </ResourceDictionary>
    

    primitives命名空间以防万一我需要了解BulletDecorator是什么。

    我在here的Aero主题中找到了 BulletDecorator ,位于“默认WPF主题”链接后面的this answer

    我看到我的复选框大小没有区别。我不认为我从主题中抓取了错误的元素类型,但还有什么可以发生?

    修改1:

    BulletDecorator无论如何都包含复选框的内容,所以我尝试删除了#3的要求。现在我有一个巨大的盒子和巨大的文字,并希望缩小文本。这是 CheckBoxStyle.xaml

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework">
        <Style TargetType="{x:Type CheckBox}">
            <Style.Resources>
                <Style TargetType="{x:Type ContentControl}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ContentControl}">
                                <ContentPresenter>
                                    <ContentPresenter.LayoutTransform>
                                        <ScaleTransform ScaleX="0.5" ScaleY="0.5" />
                                    </ContentPresenter.LayoutTransform>
                                </ContentPresenter>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Style.Resources>
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <ScaleTransform ScaleX="2" ScaleY="2"/>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    

1 个答案:

答案 0 :(得分:5)

我找到了一个解决方案,虽然它并不完美。仍然可以接受更好的答案。

我使用Snoop来确定我关注的元素已经是ContentPresenter。它包含一个TextBlock,但由于某种原因无法设置样式(并且它在Snoop的层次结构中显示在括号中)。这是我的结果 CheckBoxStyle.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework">
    <Style TargetType="{x:Type CheckBox}">
        <Style.Resources>
            <Style TargetType="{x:Type ContentPresenter}">
                <Setter Property="LayoutTransform">
                    <Setter.Value>
                        <ScaleTransform ScaleX="0.5" ScaleY="0.5" />
                    </Setter.Value>
                </Setter>
            </Style>
        </Style.Resources>
        <Setter Property="LayoutTransform">
            <Setter.Value>
                <ScaleTransform ScaleX="2" ScaleY="2"/>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>