我有一个单独的窗口wpf应用程序,并尝试设置一个窗口范围的样式以应用于我的所有TextBox控件。我有另一种样式在TextBlock控件上按预期工作,但由于某种原因,TextBox样式仅在我使用x:Key时才起作用。我试图让这种风格成为我窗口中所有TextBox的全局。
我应该注意到我在TextBox样式上尝试了多个属性,包括边框粗细,前景,背景,TextWeight等,除非键入为每个TextBox控件显式定义样式,否则无效。
这段代码目前在我的App.xaml中,但我也在Window.Resources下进行了测试。
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:GraphicalNestingCalculator.ViewModel" />
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Blue"/>
</Style>
<Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Red"/>
</Style>
</ResourceDictionary>
堆叠面板中的TextBox
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="10,0,10,0"/>
</Style>
</StackPanel.Resources>
<TextBlock>Part Width:</TextBlock>
<TextBox Name="partWidthTextBox" Text="{Binding Path=Layout.Part.Width, UpdateSourceTrigger=LostFocus}" Style="{StaticResource TextBoxStyle}" Width="50" >
</TextBox>
<TextBlock>Part Height:</TextBlock>
<TextBox Name="partHeightTextBox" Text="{Binding Path=Layout.Part.Height, UpdateSourceTrigger=LostFocus}" Style="{StaticResource TextBoxStyle}" Width="50" />
</StackPanel>
答案 0 :(得分:1)
如果你想要没有x:Key的隐式Style和你在App.xaml或<Window.Resources>
中定义的样式,你应该将前者放在后者上:
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Margin" Value="10,0,10,0"/>
<Setter Property="FontSize" Value="40" />
</Style>
</StackPanel.Resources>
<TextBlock>Part Width:</TextBlock>
<TextBox Name="partWidthTextBox" Text="{Binding Path=Layout.Part.Width, UpdateSourceTrigger=LostFocus}" Width="50" >
</TextBox>
<TextBlock>Part Height:</TextBlock>
<TextBox Name="partHeightTextBox" Text="{Binding Path=Layout.Part.Height, UpdateSourceTrigger=LostFocus}" Width="50" />
</StackPanel>
<强> App.xaml中:强>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:GraphicalNestingCalculator.ViewModel" />
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Blue"/>
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Red"/>
</Style>
</ResourceDictionary>
在TextBox上设置Style="{StaticResource TextBoxStyle}"
时,将忽略您在<StackPanel.Resources>
中定义的隐式样式。这是预期的行为。
答案 1 :(得分:0)
定义窗口范围的资源样式时必须删除密钥,否则您需要稍后明确引用它
</Style>
<Style TargetType="TextBox">
<Setter Property="Background" Value="Red"/>
</Style>
修改的
如果你想要还一个更具体的风格,那么更具体的风格应该基于窗口宽度:BasedOn="{StaticResource {x:Type TextBox}}"
(如另一个答案所示)
无论如何,由于对于StackPanel子项的设置边距的要求可以比
<StackPanel Orientation="Horizontal" local:MarginSetter.Margin="10">
边距的最后一个通用解决方案更复杂但是 - 对于要加载的面板的子项 - 我订阅了以下事件
private void StackPanel_Loaded(object sender, RoutedEventArgs e)
{
MarginSetter.CreateThicknesForChildren(sender, new DependencyPropertyChangedEventArgs());
}