2009-08-08 1 views
4

У меня есть этот элемент controltempalte + trigger в моем приложении WPF.ControlTemplate.Triggers WPF эквивалент в Silverlight 3

<ControlTemplate TargetType="me:MyControl" x:Key="fade"> 
    <ContentPresenter - other stuff /> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsTransitioned" Value="True"> 
      <Trigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation -<stuff>- />         
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Это работает классно в WPF и очень интуитивно для меня, чтобы написать это на основе триггера, как указано выше.

Когда я переношу это на Silverlight (3), мне говорят, что мне нужно использовать VSM, состояния и группы и т. Д., Поскольку триггеры на шаблоне управления не поддерживаются. Я посмотрел на некоторые образцы, и я даже попытался применить биты VSM в месте триггера, как указано выше, но не может заставить его работать.

Кто-то предложил мне, что кроме VSM в XAML, я должен будет обрабатывать некоторые события и т.д.

SL3 модель просто быть болезненным для меня. Пожалуйста помоги.

+0

Хм, почему-то часть моего поста не вынесенное ... то это бит на вершине моего фрагмента кода ... Но anywya, вы получите представление о моей проблеме. что более важно :-) – 2009-08-08 18:17:21

+0

Весь код должен быть inden ted на 4 пробела, поэтому SO знает, что это фрагмент кода. Самый быстрый способ сделать это - выбрать весь свой код в Visual Studio и нажать вкладку, прежде чем копировать ее. Я думаю, в остальном он думает, что это должен быть какой-то HTML, и он не игнорирует его. – mattmanser

+0

Спасибо матовый. Thnx для отступов :-) Я исправил свои биты кода сейчас :-) – 2009-08-11 20:18:51

ответ

11

Silverlight 3 представил триггеры взаимодействия, которые, насколько я могу судить, делают то, что вы хотите, но немного сложнее. Тем не менее, их очень мало.

Если вы делаете это вручную, вам нужны ссылки на System.Windows.Interactivity и Microsoft.Expression.Interactions (из Blend 3 класс будет на вкладке ссылок, если вы его установили).

Если вы добавите триггеры в Blend, то он добавит их автоматически. Это называется Behaviors в Silverlight 3, и вы найдете их в Blend в разделе Behaviors на вкладке Assets.

Пример того, как они работают. Обратите внимание на раскадровку, сидящую в ресурсе второго прямоугольника, я не мог заставить ее работать внутри ControlStoryboardAction.Storyboard, но она работала, если я сделал прямоугольник ContentControl и поместил его в шаблон. Это может быть ошибка или я что-то отсутствует:

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    x:Class="SLTrigger.MainPage" 
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
    xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"> 
    <Grid x:Name="LayoutRoot"> 
    <StackPanel> 
     <Rectangle Margin="5" Fill="Blue" Width="200" Height="100"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseLeftButtonDown"> 
        <ic:ChangePropertyAction PropertyName="Fill" Duration="0"> 
         <ic:ChangePropertyAction.Value> 
          <SolidColorBrush Color="Red"/> 
         </ic:ChangePropertyAction.Value> 
        </ic:ChangePropertyAction> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Rectangle> 
     <Rectangle Margin="5" x:Name="AnimatedRectangle2" Fill="Blue" Width="200" Height="100"> 
      <Rectangle.Resources> 
       <Storyboard x:Key="AnimationStoryboard"> 
        <ColorAnimation 
         Storyboard.TargetName="AnimatedRectangle2" 
         Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
         To="Red" 
         AutoReverse="True" 
         Duration="0:0:0.5" /> 
       </Storyboard> 
      </Rectangle.Resources> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseLeftButtonDown"> 
        <im:ControlStoryboardAction ControlStoryboardOption="Play" Storyboard="{StaticResource AnimationStoryboard}"> 
         <!-- 
         Doesn't work, but does work inside control templates?? 
         <im:ControlStoryboardAction.Storyboard> 
          <Storyboard> 
           <ColorAnimation 
             Storyboard.TargetName="AnimatedRectangle2" 
             Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
             To="Red" 
             AutoReverse="True" 
             Duration="0:0:0.5" /> 
          </Storyboard> 
         </im:ControlStoryboardAction.Storyboard> 
         --> 
        </im:ControlStoryboardAction> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Rectangle> 
     <ContentControl> 
      <ContentControl.Template> 
       <ControlTemplate> 
        <Rectangle Margin="5" x:Name="AnimatedRectangle3" Fill="Blue" Width="200" Height="100"> 
         <i:Interaction.Triggers> 
          <i:EventTrigger EventName="MouseLeftButtonDown"> 
           <im:ControlStoryboardAction ControlStoryboardOption="Play"> 
            <im:ControlStoryboardAction.Storyboard> 
             <Storyboard> 
              <ColorAnimation 
                Storyboard.TargetName="AnimatedRectangle3" 
                Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
                To="Red" 
                AutoReverse="True" 
                Duration="0:0:0.5" /> 
             </Storyboard> 
            </im:ControlStoryboardAction.Storyboard> 
           </im:ControlStoryboardAction> 
          </i:EventTrigger> 
         </i:Interaction.Triggers> 
        </Rectangle> 
       </ControlTemplate> 
      </ContentControl.Template> 
     </ContentControl> 
     <TextBlock TextAlignment="Center" Text="Click the rectangles" /> 
     </StackPanel> 
    </Grid> 
</UserControl> 

Файл класс не имеет ничего в нем:

using System.Windows.Controls; 

namespace SLTrigger 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+0

отличный материал. ОК, так что все-таки это триггер события, и до сих пор нет способа запуска свойства? В таком случае, могу ли я просто создать пользовательское событие в элементе управления, когда это свойство изменится, и использовать триггер событий, основанный на взаимодействии, который вы показали выше? Будет ли это работать? Как-то мне нужно заставить раскадровку работать (в XAML), когда изменяется значение свойства в моем элементе управления. Я не хочу кодировать его на C#. Я хочу сохранить его в XAML как есть. – 2009-08-11 20:17:05

+0

Я знаю, что этот вопрос старый, но теперь у Silverlight 4 есть дополнительные триггеры, включая триггер с измененным свойством. –

+0

Почему никто никогда не прокомментировал этот ответ передо мной? –