Pregunta

He estado tratando de construir un cuadro de texto con una pista que se muestra mientras está vacía. Tengo problemas para establecer el texto de sugerencia de un estilo.

Ser preciso, esto obras (es decir, se une correctamente):

    <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>

Pero, cuando lo muevo al estilo, no lo hace:

<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}" />

Entonces, ¿cuál es la captura? ¿Cómo puedo vincular a la propiedad del antepasado desde un estilo?

¿Fue útil?

Solución

El problema no es con el relativource, sino con la forma en que está utilizando el VisualBrush. Recuerde que los estilos se comparten entre los elementos a los que los aplica. La razón por la que su ejemplo no funciona es que, en efecto, está tratando de compartir un solo cuadro de texto (el que etiquetó "interno") con múltiples cuadros de texto principales.

Para ver por qué esto es un problema, intente un experimento de pensamiento: el cuadro de texto interno se crea una vez (en términos generales, esto sucederá cuando se cree el estilo). ¿A cuál de los cuadros de texto a los que se aplica el estilo debe elegirse como el antepasado del cuadro de texto interno cuando usa la vinculación de relativos?

Esta es la razón por Plantillas de datos y ControlTemplates existen en WPF. En lugar de instanciar las imágenes directamente, definen una plantilla que permita que se creen múltiples copias de imágenes según sea necesario.

Otros consejos

ReativeSource no funciona como se esperaba. Es mejor crear un cuadro de texto de marca de agua usando la plantilla de control. Pero tu versión podría funcionar:

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top