为什么我的Window-wide TextBox样式不适用?

时间:2017-02-05 00:35:54

标签: c# wpf xaml

我有一个单独的窗口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>

2 个答案:

答案 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子项的设置边距的要求可以比 更多泛型,还有另一个选项attached property而不是样式

<StackPanel Orientation="Horizontal" local:MarginSetter.Margin="10">

边距的最后一个通用解决方案更复杂但是 - 对于要加载的面板的子项 - 我订阅了以下事件

    private void StackPanel_Loaded(object sender, RoutedEventArgs e)
    {
        MarginSetter.CreateThicknesForChildren(sender, new DependencyPropertyChangedEventArgs());
    }