2011-02-02 12 views
14

Si la persona que respondió this question está en lo cierto, no puede poner un enlace como el valor en un setter en un estilo en Silverlight. Lo cual es una pena, porque tengo 4 bloques de texto que usan exactamente el mismo enlace para su propiedad Opacidad. ¿Hay algún modo de "estilizar" su propiedad de Opacidad para que los cuatro señalen la misma vinculación? De lo contrario, tengo que configurar cada propiedad de Opacidad de forma individual. En mi caso, es aún peor: los cuatro comparten otros enlaces de propiedades, lo que significa que cada declaración de TextBlock es bastante larga, y sin embargo, todos son virtualmente iguales (sus enlaces de propiedad, eso es). Sé que podría establecer concisamente todas las vinculaciones de propiedad compartida en el código subyacente, pero me gustaría una solución XAML si la hay.Silverlight: Cómo usar un enlace en setter para un estilo (o un trabajo equivalente)

Gracias!

+1

Puede aplicar el encuadernado en la configuración de estilo en WPF, entonces, ¿solo pregunta por Silverlight? – baalazamon

+0

Ah, no me di cuenta de eso. Edité mi pregunta para decir específicamente Silverlight. – JoeCool

Respuesta

11

Así es como se hace. Se utiliza un ContentControl y especifica un ControlTemplate por ella como un recurso estático: -

<Grid.Resources> 
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl"> 
     <TextBlock Opacity="{Binding SomeOpacity}" Text="{TemplateBinding Content}" /> 
    </ControlTemplate> 
<Grid.Resource> 
<ContentControl Content="{Binding SomeTextValue}" Template="{StaticResource CommonTextBlock}" /> 
<ContentControl Content="{Binding SomeOtherTextValue}" Template="{StaticResource CommonTextBlock}" /> 

Ahora puede tapón que pueden otras propiedades con fijaciones en la plantilla de control como desee.

Este enfoque podría extenderse a Style: -

<Grid.Resources> 
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl"> 
     <TextBlock Opacity="{Binding SomeOpacity}" Text="{TemplateBinding Content}" /> 
    </ControlTemplate> 
    <Style x:Key="CommonTextBlockStyle" TargetType="ContentControl"> 
     <Setter Property="Template" Value="{StaticResource CommonTextBlock}" /> 
     <Setter Property="Foreground" Value="Blue" /> 
    </Style> 
<Grid.Resource> 
<ContentControl Content="{Binding SomeTextValue}" Style="{StaticResource CommonTextBlockStyle}" /> 
<ContentControl Content="{Binding SomeOtherTextValue}" Style="{StaticResource CommonTextBlockStyle}" /> 
+0

Me gusta la idea detrás de esto, pero parece que TextBlock no tiene una propiedad de Plantilla. ¿Hay algo que estoy haciendo mal? – JoeCool

+0

Esa es una solución muy buena que tienes allí. –

+0

@JoeCool: Lo siento, esos elementos 'TextBlock' deben ser controles de contenido. Editado en consecuencia. (Sabía que debería cortar 'pasado' en lugar de escribir el código de nuevo). – AnthonyWJones

1

En Silverlight: Bueno ... sí, no puedes hacer una encuadernación. Aquí utilicé un recurso estático (que probablemente no satisfaga sus necesidades). Esto es lo más cercano que va a obtener sin hacer los enlaces en el código.

<UserControl x:Class="SilverlightApplication1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:system="clr-namespace:System;assembly=mscorlib" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400" 
    Name="this" Tag="0.5"> 

    <UserControl.Resources> 
    <system:Double x:Key="opacity">0.5</system:Double> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Opacity" Value="{StaticResource opacity}"/> 
    </Style> 
    </UserControl.Resources> 
    <StackPanel> 
    <TextBlock Text="ABC"/> 
    <TextBlock Text="DEF"/> 
    <TextBlock Text="GHI"/> 
    <TextBlock Text="JKL"/> 
    </StackPanel> 
</UserControl> 

EDIT: Bueno, aquí está en WPF de todos modos ...

Aquí tiene, en WPF:

<Window x:Class="WpfApplication8.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Name="MyWindow" Tag="0.5"> 
    <Window.Resources> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Opacity" Value="{Binding ElementName=MyWindow, Path=Tag}"/> 
    </Style> 
    </Window.Resources> 
    <StackPanel> 
    <TextBlock Text="ABC"/> 
    <TextBlock Text="DEF"/> 
    <TextBlock Text="GHI"/> 
    <TextBlock Text="JKL"/> 
    </StackPanel> 
</Window> 

Por supuesto se puede conseguir mucho más creativa que esto . Además, dependiendo de cómo/cuándo/dónde se definan sus estilos, a veces es más fácil hacerlo en el código.

2

Echa un vistazo SetterValueBindingHelper en este blog article y soporte para Binding en el estilo setters es announced for SL5.

+0

Desafortunadamente, este sigue siendo un tipo de solución de "agregar código para resolver el problema". – AnthonyWJones

Cuestiones relacionadas