UWP CustomControl样式不会从默认样式继承

时间:2016-05-10 07:05:35

标签: c# win-universal-app uwp-xaml

我正在创建自定义控件(而不是UserControl),我将默认样式放在generic.xaml中。由于我的操作基于CheckBox,除了在后端添加一些额外的逻辑并且可能覆盖单个属性之外,我并没有真正做任何有趣的事情,我希望将我的样式基于默认样式。

以前,我可以做类似

的事情
<Style TargetType="local:MyCheckBox" BasedOn="CheckBox">
  <Setter Property="..." Value="..." />
</Style>

这将使用默认样式并覆盖我的单个属性。这在UWP应用程序中是否可行,或者我是否需要复制整个内置样式并更改我的单个属性?

我的课程定义如下:

public class MyCheckBox : CheckBox
{
    public MyCheckBox()
    {
        this.DefaultStyleKey = typeof(MyCheckBox);
    }

    // etc.
}

1 个答案:

答案 0 :(得分:0)

<Style TargetType="local:MyCheckBox" BasedOn="CheckBox">
  <Setter Property="..." Value="..." />
</Style>
  

这将使用默认样式并覆盖我的单个属性。这在UWP应用程序中是否可行,或者我是否需要复制整个内置样式并更改我的单个属性?

就我而言,如果我使用BasedOn="CheckBox"并在主页中放置MyCheckBox,则会出现此错误:

  

名称&#34; MyCheckBox&#34;命名空间中不存在&#34; xxxx&#34;。

     

属性的值无效&#39; BasedOn&#39;:...

     

无法指定文字值&#39; CheckBox&#39;进入财产&#39; BasedOn&#39;类型&#39;风格&#39;。

如果您想在此处使用BasedOn样式,可以参考Use based-on styles。根据此文档,您需要在此使用StaticResource

但我不认为这里只使用BasedOn样式可以解决问题。是的,你是对的,CustomControl样式不会从默认样式继承,如你所见,generic.xaml包含一个默认样式,在这种风格中只有ControlTemplateBorder ,它是空的。

  

由于我的操作基于CheckBox,除了在后端添加一些额外的逻辑并且可能覆盖单个属性之外我并没有真正做任何有趣的事情我想将我的样式基于默认样式。

如果我正确理解您的请求,由于customcontrol的模板快速为空,所以您也是对的,您需要复制整个内置样式。例如,您可以像CheckBox ControlTemplate一样修改模板:

<Style x:Key="CheckBoxStyle" TargetType="CheckBox">
    <Setter Property="Background" Value="Blue" />
    <Setter Property="Foreground" Value="Red" />
    <Setter Property="Padding" Value="8,5,0,0" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="VerticalContentAlignment" Value="Top" />
    <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
    <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" />
    <Setter Property="MinWidth" Value="120" />
    <Setter Property="MinHeight" Value="32" />
    <Setter Property="UseSystemFocusVisuals" Value="True" />
</Style>
<Style TargetType="local:MyCheckBox" BasedOn="{StaticResource CheckBoxStyle}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyCheckBox">
                <Grid BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="20" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Grid Height="32" VerticalAlignment="Top">
                        <Rectangle x:Name="NormalRectangle" Fill="Transparent" Height="20" Stroke="{ThemeResource SystemControlForegroundBaseMediumHighBrush}" StrokeThickness="{ThemeResource CheckBoxBorderThemeThickness}" UseLayoutRounding="False" Width="20" />
                        <FontIcon x:Name="CheckGlyph" Foreground="{ThemeResource SystemControlHighlightAltChromeWhiteBrush}" FontSize="20" FontFamily="{ThemeResource SymbolThemeFontFamily}" Glyph="&#xE001;" Opacity="0" />
                    </Grid>
                    <ContentPresenter x:Name="ContentPresenter" AutomationProperties.AccessibilityView="Raw" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Content="{TemplateBinding Content}" Grid.Column="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" TextWrapping="Wrap" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

但我认为您也可以像这样修改自定义控件的模板:

<Style x:Key="CheckBoxStyle1" TargetType="CheckBox">
    <Setter Property="Foreground" Value="Red" />
</Style>
<Style TargetType="local:MyCheckBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyCheckBox">
                <CheckBox Content="222" Style="{StaticResource CheckBoxStyle1}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这会使您的CustomControl获得CheckBox的默认样式,那么您要更改哪个属性?