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>