2009-08-14 13 views
14

Trochę borykam się z pewną składnią XAML. Mam nadzieję, że ktoś może doradzić. Chcę utworzyć zasób typu "Effect", który zawiera definicję DropShadowEffect, która może być ponownie używana, zamiast zawsze ręcznie ustawiać właściwości. Oto, co mam:Tworzenie stylu cienia w XAML

<Style TargetType="DropShadowEffect" x:Name="DropShadowEffectStyle"> 
    <Setter Property="BlurRadius" Value="5" /> 
    <Setter Property="Direction" Value="315" /> 
    <Setter Property="ShadowDepth" Value="2" /> 
    <Setter Property="Opacity" Value="0.5" /> 
</Style> 

<Style TargetType="TextBlock" x:Name="PageTabLabelStyle"> 
    <Setter Property="FontSize" Value="16" /> 
    <Setter Property="FontFamily" Value="Arial" /> 
    <Setter Property="Foreground" Value="#EFEFEF" /> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
    <Setter Property="Margin" Value="0, 10, 0, 10" /> 
    <Setter Property="Effect" Value="{StaticResource DropShadowEffectStyle}" /> 
</Style> 

Ta operacja kończy się niepowodzeniem przy każdym uruchomieniu, więc oczywiście brakuje mi czegoś. Myślę, że jest to wokół właściwości "Effect" stylu bloku tekstowego, oczekującego typu "Effect", a nie typu "DopShadowEffect". Jakieś pomysły?

Odpowiedz

28

Nie można "stylować" efektu, ponieważ styl jest właściwością Kontroli, a efekt nie jest Kontrolą.

Co naprawdę chcesz zrobić, to umieść sam efekt w słowniku zasobów i użyj odnośnika StaticResource, aby wskazać na niego. Coś jak:

<UserControl.Resources> 
    <DropShadowEffect x:Key="dropShadow" BlurRadius="25" Direction="315" /> 
    <Style TargetType="TextBlock" x:Name="PageTabLabelStyle"> 
     <Setter Property="FontSize" Value="16" /> 
     <Setter Property="FontFamily" Value="Arial" /> 
     <Setter Property="Foreground" Value="#EFEFEF" /> 
     <Setter Property="VerticalAlignment" Value="Center" /> 
     <Setter Property="Margin" Value="0, 10, 0, 10" /> 
     <Setter Property="Effect" Value="{StaticResource dropShadow}" /> 
    </Style> 
</UserControl.Resources> 
+0

Doskonale, dzięki Keith. Prawdopodobnie warto wspomnieć o deklaracji DropShadowEffect, która musi pojawić się zanim zostanie przywołana (w przypadku, gdyby nie było to od razu oczywiste!). –

+0

Znalazłem inny sposób to zrobić [tutaj] (http://stackoverflow.com/a/5157480/3029422) – Ionut