C# 为什么文本框不继承背景色?

C# 为什么文本框不继承背景色?,c#,wpf,xaml,C#,Wpf,Xaml,以下是一个完全可复制的示例: <Window x:Class="DemoWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http:/

以下是一个完全可复制的示例:

<Window x:Class="DemoWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid Name="GridMain">

        <Grid.Resources>
            <Style x:Key="{x:Type Grid}">
                <Setter Property="Control.Background" Value="Red"/>
            </Style>
        </Grid.Resources>

        <StackPanel>
            <Label>First Content</Label>
            <TextBox>First Edit</TextBox>
            <StackPanel>
                <Label>Second Content</Label>
                <TextBox>Second Edit</TextBox>
            </StackPanel>
        </StackPanel>
        
    </Grid>
</Window>
其结果如下:

我感到困惑的是,具有从控件继承的BackgroundProperty-与标签没有什么不同。但是,可以看到,文本框的背景颜色没有改变。虽然网格没有Control.Background属性,但有Panel.Background属性,但它仍然设置了其背景属性,即使设置的属性是Control.Background。

简短回答:

因为它不是透明的,所以默认情况下它有一种颜色:

文本框是一个输入字段,因此应该很容易识别

另一方面,为了方便/设计,标签是透明的:

假设它有一个默认的颜色在这种情况下,蓝色它不会很方便,对吗

我们要说的是,标签应该融入背景,而文本框等字段应该很容易根据性质进行区分。

简短回答:

因为它不是透明的,所以默认情况下它有一种颜色:

文本框是一个输入字段,因此应该很容易识别

另一方面,为了方便/设计,标签是透明的:

假设它有一个默认的颜色在这种情况下,蓝色它不会很方便,对吗

我们要说的是,标签应该融入背景,而文本框之类的字段应该很容易区分

用于继承的对象的BaseOn属性

我感到困惑的是TextBox类有一个从控件继承的BackgroundProperty,与Label没有什么不同。但是,可以看到,文本框的背景颜色没有改变

每个控件都有一个默认值。它们定义控件所需的部分、其外观和视觉状态。背景是可以定义或不定义的属性之一,具体取决于控件。对于您使用的控件,背景定义如下:

标签:透明 文本框: 网格:无,默认值。 StackPanel:无,默认值。 因此,标签看起来是红色的,但不是红色的。它是StackPanel或网格背景,您可以通过其透明背景看到。对于文本框,背景不会因为更改而更改。TextBox默认隐式样式的背景值的优先级高于本地样式设置器

现在该怎么办?为背景指定更高的优先级,例如:

将其添加为本地值

定义样式并将其直接指定给TextBox的样式属性

为文本框定义隐式样式

虽然网格没有Control.Background属性,但有Panel.Background属性,但它仍然设置了其Background属性,即使设置的属性是Control.Background

这是WPF中的另一个实现细节。正如您在中所看到的,它定义了背景属性,但当您查看时,您可以看到它本身并没有定义背景属性,而是将自身添加为面板定义的属性的所有者。从:

通常,AddOwner用于向尚未通过托管类继承公开依赖性属性的类添加依赖性属性。类继承将导致包装器属性由派生类继承,因此将提供对依赖性属性的常规成员表访问。AddOwner使属性系统能够识别初始未注册依赖属性的类型上的依赖属性

换句话说,属性的工作方式就好像它们是继承的一样,XAML处理器足够聪明,能够识别Control.Background和Panel.Background属性本质上是相同的

我感到困惑的是TextBox类有一个从控件继承的BackgroundProperty,与Label没有什么不同。但是,可以看到,文本框的背景颜色没有改变

每个控件都有一个默认值。它们定义控件所需的部分、其外观和视觉状态。背景是可以定义或不定义的属性之一,具体取决于控件。对于您使用的控件,背景定义如下:

标签:透明 文本框: 网格:无,默认值。 StackPanel:无,默认值。 因此,标签看起来是红色的,但不是红色的。它是StackPanel或网格背景,您可以通过其透明背景看到。对于文本框,背景不会因为更改而更改。TextBox默认隐式样式的背景值的优先级高于本地样式设置器

现在该怎么办?为背景指定更高的优先级,例如:

将其添加为本地值

定义样式并将其直接指定给样式p 文本框的属性

为文本框定义隐式样式

虽然网格没有Control.Background属性,但有Panel.Background属性,但它仍然设置了其Background属性,即使设置的属性是Control.Background

这是WPF中的另一个实现细节。正如您在中所看到的,它定义了背景属性,但当您查看时,您可以看到它本身并没有定义背景属性,而是将自身添加为面板定义的属性的所有者。从:

通常,AddOwner用于向尚未通过托管类继承公开依赖性属性的类添加依赖性属性。类继承将导致包装器属性由派生类继承,因此将提供对依赖性属性的常规成员表访问。AddOwner使属性系统能够识别初始未注册依赖属性的类型上的依赖属性

换句话说,属性的工作方式就好像它们是继承的一样,XAML处理器足够聪明,可以识别Control.Background和Panel.Background属性本质上是相同的。

文本框和标签确实共享相同的背景属性,但默认情况下它们将其设置为不同的值。如果您不喜欢默认设置:First Edit,只需将背景设置为透明即可。文本框和标签确实共享相同的背景属性,但它们在默认情况下将其设置为不同的值。如果您不喜欢默认设置:First Edit,只需将背景设置为透明即可。
    <Grid.Resources>
        <Style x:Key="DefaultStyle" TargetType="{x:Type FrameworkElement}">
            <Setter Property="Control.Background" Value="Red"/>
        </Style>
        <Style  TargetType="TextBox" BasedOn="{StaticResource DefaultStyle}"/>
        <Style TargetType="Label" BasedOn="{StaticResource DefaultStyle}"/>
        
    </Grid.Resources>


    <StackPanel>
        <Label>First Content</Label>
        <TextBox>First Edit</TextBox>
        <StackPanel>
            <Label>Second Content</Label>
            <TextBox>Second Edit</TextBox>
        </StackPanel>
    </StackPanel>

</Grid>
<Style x:Key="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
   <Setter Property="Control.Background" Value="Red"/>
</Style>