我一直在尝试构建一个带有提示的文本框,该提示在空白时显示。我很难从样式内设置提示文本。

确切地说,这个 作品 (也就是说,它绑定正确):

    <TextBox Tag="hint text">
        <TextBox.Background>
            <VisualBrush Stretch="None">
                <VisualBrush.Visual>
                    <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" />
                </VisualBrush.Visual>
            </VisualBrush>
        </TextBox.Background>
    </TextBox>

但是,当我将其移至样式时,它不会:

<Style TargetType="TextBox" x:Key="stlHintbox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
            <Setter Property="Background">
                <Setter.Value>
                    <VisualBrush Stretch="None">
                        <VisualBrush.Visual>
                            <TextBlock Tag="inner" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" 
                                       FontStyle="Italic" Foreground="LightGray" />
                        </VisualBrush.Visual>
                    </VisualBrush>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

<TextBox Tag="hint text" Style="{StaticResource stlHintbox}" />

那捕获是什么?如何从样式内与祖先财产约束?

有帮助吗?

解决方案

问题不是在于亲戚,而是您使用VisualBrush的方式。回想一下您将它们应用于它们之间的元素之间共享样式。您的示例不起作用的原因是,实际上,您正在尝试与多个父文本框共享单个文本框(您标记为“ Inner”)。

要查看为什么这是一个问题,请尝试一个思考实验:内部文本框一次创建一次(粗略地说,这将在创建样式时发生)。当您使用“私人”绑定时,应选择应用哪些样式的文本框作为内部文本框的祖先?

这就是为什么 DatatemplatesControlTemplates 存在于WPF中。它们不是直接实例化视觉效果,而是定义一个模板,该模板允许根据需要创建多个视觉效果。

其他提示

Reativesource无法正常工作。最好使用控制模板创建水印文本框。但是您的版本可以起作用:

<Window.Resources>
    <Style TargetType="TextBox" x:Key="stlHintbox">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
                <Setter Property="TextBox.Background">
                    <Setter.Value>
                        <VisualBrush Stretch="None" Visual="{Binding ElementName=hintText}"/>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <TextBox Tag="hint text" x:Name="myTextBox" Style="{StaticResource stlHintbox}" />
    <Border Visibility="Hidden">
        <TextBlock x:Name="hintText" Text="{Binding Tag, ElementName=myTextBox}" FontStyle="Italic" Foreground="LightGray" />
    </Border>
</StackPanel>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top