CustomControl 的样式未应用于通用文件

Style for a CustomControl is not applied in Generic file

我有一个自定义控件,我在那个自定义控件中加载了 TextBox,并且我在 Generic.XAML 文件中为 TextBox 自定义了样式,但未应用该样式, 请参考以下代码

CustomControl.cs

class CustomControl1 : Control
{
    public CustomControl1()
    {
        this.DefaultStyleKey = typeof(CustomControl1);
    }
}

Generic.XAML

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CustomControl">
<Style TargetType="TextBox">
    <Setter Property="Foreground" Value="Red"/>
</Style>
<Style TargetType="local:CustomControl1">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:CustomControl1">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <TextBox Width="100" Height="100" Text="Hi"
                             VerticalAlignment="Center" HorizontalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

MainWindow.XAML

<Page
x:Class="CustomControl.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CustomControl"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid>
    <local:CustomControl1   VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Height="200"/>
</Grid>

我已经在 Generic.XAML 文件中设置了 TextBox 的前景色,但是没有设置到 TextBox。请参考下图,

如果我在 Page.Resources 中为 MainWindow.XAML 中的文本框自定义样式,则它可以正常工作。但我需要在 Generic.XAML 本身进行定制。

对此有何建议?

有多种解决方案:

  1. 只需在 TextBox 上设置 Foreground 属性。

既然你问了这个问题,我想你会有多个 TextBox 并且不想重复设置 属性。如果有一天颜色必须改变,你将有很多工作。

  1. 为您的 TextBox 样式指定一个键并应用该样式。

很容易修复,但如果有多种类型的控件 Foreground 属性.

则不完美
<Style x:Key="RedStyle" TargetType="TextBox">
    <Setter Property="Foreground" Value="Red"/>
</Style>
<Style TargetType="local:CustomControl1" >
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:CustomControl1">
                <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                    <TextBox Width="100" Height="100" Text="Hi" Style="{StaticResource RedStyle}"
                         VerticalAlignment="Center" HorizontalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  1. 在您的模板上定义 Foreground 属性 并使用 TemplateBinding

这是我最喜欢的修复程序。

<Style TargetType="local:CustomControl1" >
    <Setter Property="Foreground" Value="Red" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:CustomControl1">
                <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                    <TextBox Width="100" Height="100" Text="Hi" Foreground="{TemplateBinding Foreground}"
                         VerticalAlignment="Center" HorizontalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>