2011-02-02 8 views
14

Jeśli osoba, która odpowiedziała this question ma rację, nie można ustawić wiązania w funkcji ustawiającej w stylu w Silverlight. To wstyd, ponieważ mam 4 bloki tekstowe, które używają dokładnie tego samego wiązania dla swojej właściwości Opacity. Czy w jakimś sensie w pewnym sensie "styl" ich własności krycia tak, że wszystkie cztery z nich wskazują na to samo wiązanie? W przeciwnym razie muszę ustawić każdą właściwość Opacity indywidualnie. W moim przypadku jest jeszcze gorzej - wszystkie cztery mają również inne powiązania własności, co oznacza, że ​​każda deklaracja TextBlock jest dość długa, a mimo to wszystkie są praktycznie takie same (ich powiązania własności, to znaczy). Wiem, że mogłem zwięźle ustawić wszystkie ich powiązania własności współdzielonej w kodzie z tyłu, ale chciałbym rozwiązanie XAML, jeśli takie istnieje.Silverlight: Sposób użycia wiązania w ustawiaczu dla stylu (lub równoważnego obejścia)

Dzięki!

+1

Możesz zastosować wiązanie w ustawieniach stylu w WPF, więc czy pytasz tylko o Silverlight? – baalazamon

+0

Ach, nie zdawałem sobie z tego sprawy. Zmieniłem moje pytanie, by powiedzieć konkretnie Silverlight. – JoeCool

Odpowiedz

11

Oto jak to się robi. Użyć ContentControl i określ ControlTemplate dla niego jako zasób statycznej: -

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

Teraz można na korki, które mogą inne właściwości z wiązaniami w Szablon do sterowania, jak chcesz.

Takie podejście może być przedłużony do 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

Podoba mi się pomysł, ale wydaje się, że TextBlock nie ma właściwości Template. Czy jest coś, co robię źle? – JoeCool

+0

To całkiem miłe obejście, które tam masz. –

+0

@JoeCool: Przepraszam, że elementy 'TextBlock' powinny być kontrolkami zawartości. Edytowane odpowiednio. (Wiedziałem, że powinienem wycinać "nie", zamiast pisać kod ponownie). – AnthonyWJones

1

W Silverlight: Cóż ... tak, nie możesz zrobić wiązania. Tutaj użyłem statycznego zasobu (który prawdopodobnie nie spełni twoich potrzeb). To jest najbliższe, co otrzymasz bez wykonywania powiązań w kodzie.

<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: Cóż, tutaj jest w WPF tak ...

Proszę, w 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> 

oczywiście można uzyskać o wiele bardziej twórczy niż ten . Ponadto, w zależności od tego, jak/kiedy/gdzie zdefiniowane są twoje style, czasami łatwiej jest zrobić to w kodzie.

Powiązane problemy