空文本框默认文本

时间:2014-02-27 12:46:11

标签: wpf dynamic binding static styles

在我的Window.Resources中,我有以下风格:

    <Style TargetType="TextBox" x:Key="HintText" xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <Style.Resources>
            <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
                <VisualBrush.Visual>
                    <Label Content="{DynamicResource EmptyText}" Foreground="LightGray" />
                </VisualBrush.Visual>
            </VisualBrush>
        </Style.Resources>
        <Style.Triggers>
            <Trigger Property="Text" Value="{x:Static sys:String.Empty}">
                <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
            </Trigger>
            <Trigger Property="Text" Value="{x:Null}">
                <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
            </Trigger>
            <Trigger Property="IsKeyboardFocused" Value="True">
                <Setter Property="Background" Value="White" />
            </Trigger>
        </Style.Triggers>
    </Style>

如果我将此用于1 TextBox,

<Label Content="Test" Foreground="LightGray" />

如果它是空的,测试将显示在我的TextBox中。当我尝试在不同的TextBoxes中使用此样式时,

<Label Content="{DynamicResource EmptyText}" Foreground="LightGray" />

<TextBox.Resources>
    <sys:String x:Key="EmptyText">Test</sys:String>
</TextBox.Resources>

它没有显示任何内容。是否可以将此1样式与TextBox中显示的不同字符串一起使用,或者是否必须为每个TextBox创建不同的样式?

1 个答案:

答案 0 :(得分:0)

您似乎没有在您提供的任何示例中使用此样式,并且完全不清楚您的上一个XAML块与之前的XAML块之间的关系。

但是,是的,您应该可以根据需要重新定义EmptyTextText属性将根据Dependency Property value precedence规则进行解析。

所以你可以这样做:

<DockPanel HorizontalAlignment="Stretch">
    <DockPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Text"
                    Value="{DynamicResource EmptyText/>
        </Style>
        <sys:String x:Key="EmptyText">Defined in the Dockpanel resource</sys:String>
    </DockPanel.Resources>

    <TextBlock/>

    <TextBlock>
        <TextBlock.Resources>
            <sys:String x:Key="EmptyText">Defined in the textbox resource</sys:String>
        </TextBlock.Resources>
    </TextBlock>

    <TextBlock>
        <TextBlock.Resources>
            <sys:String x:Key="EmptyText">Also defined at the textbox</sys:String>
        </TextBlock.Resources>
    </TextBlock>
</DockPanel>