WPF:除非为样式创建控件模板,否则控件样式不起作用

时间:2012-10-09 09:29:57

标签: wpf textbox styles controltemplate

最近几天这让我很生气。我有一个文本框和xaml文件中的样式。 但是没有控件模板的样式不能对文本框生效。然而,控件模板工作,但控件模板似乎完全覆盖文本框,默认行为丢失文本框,如编辑,输入或选择... 以下是带控件模板的xaml内容:

   <Style TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border Name="tbBorder"  Background="White"  BorderThickness="0.6" BorderBrush="#B9B9B9">
                        <ContentPresenter/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="BorderBrush" Value="#4D90FE" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="BorderBrush" Value="#4D90FE" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这是一种根本不起作用的简单风格,

    <Style TargetType="{x:Type TextBox}">
       <Style.Triggers>
            <Trigger Property="IsFocused" Value="true">
                <Setter Property="BorderBrush" Value="#4D90FE" />
            </Trigger>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="BorderBrush" Value="#4D90FE" />
            </Trigger>
        </Style.Triggers>
    </Style>

谢谢!

更新:整个文本框的代码段:

       <TextBox Height="23" HorizontalAlignment="Left" Margin="114,53,0,0" Name="textBox1" VerticalAlignment="Top" Width="150" Text="{Binding Path=TraderAccount, Mode=OneWayToSource, NotifyOnValidationError=True}" BorderBrush="#FFB9B9B9" BorderThickness="1" >
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="BorderBrush" Value="Red" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="BorderBrush" Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>

3 个答案:

答案 0 :(得分:2)

样式设置器对我有用,但我看到的问题是控件动画正在动画刚刚设置的样式。

您可能想要提取原始控件模板并重新定义它而不是完全重新定义它。据我所知,文本框控件比内容呈现器的边框更复杂(我从来没有为它提取控件模板!)它可能有几个边框可以实现它的所有状态等

你可以使用Blend来做到这一点 - 在没有Blend的情况下,有控件模板和样式的MSDN资源:

http://msdn.microsoft.com/en-us/library/aa970773.aspx

编辑:

对于初学者来说,它看起来像你在重新定义的模板中缺少“PART”内容

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />

编辑2:

你说这不起作用......这对我使用.NET Framework 4.0的WPF起作用 - 我将边框颜色更改为'Red'而不是确保我能看到效果并且它绝对有效,一边从红色褪色立即因为控件视觉状态被视觉状态管理器改变(这就是你需要编辑控件模板并改变视觉状态的原因)

<TextBox>  
    <TextBox.Style>  
        <Style TargetType="TextBox">  
            <Style.Triggers>  
                <Trigger Property="IsFocused" Value="true">  
                    <Setter Property="BorderBrush" Value="Red" />  
                </Trigger>  
                <Trigger Property="IsMouseOver" Value="true">  
                    <Setter Property="BorderBrush" Value="Red" />  
                </Trigger>  
            </Style.Triggers>  
        </Style>  
    </TextBox.Style>  
</TextBox>  

当您将鼠标悬停在框上时,会出现一个立即淡出的红色边框

这个XAML根本不适合你吗?

答案 1 :(得分:1)

您没有发布TextBox代码,但我认为(我也遇到过)您忘记设置BorderThickness的{​​{1}}:

textbox

答案 2 :(得分:1)

你的风格确实有效,在没有模板的情况下在你的风格中设置Background这样的属性,你会发现它确实应用了。但是,就像其他人提到的那样,您没有看到任何更改的原因是因为TextBox的默认WPF控件模板中的动画(动画值始终优先于本地值,设置器和触发器)。重新定义控件模板时,这些动画不再存在,因此您的示例可以正常工作。你可以做的是采用默认的TextBox模板并根据你的目的修改它(可以在这里找到:http://msdn.microsoft.com/en-us/library/cc645061%28VS.95%29.aspx)。