27

シナリオは次のとおりです。

私は次のユーザーコントロールを持っています.ビューモデルは、「グローをアクティブにする」必要があることをビューに通知し、それによってストーリーボードを再生できるはずです。

<UserControl x:Class="View.UnitView"  ... >
   ...
    <Storyboard x:Key="ActivateGlow">
       ...
    </Storyboard>
    ...
    <!-- INVALID BINDING! Not Dependancy Object-->
    <EventTrigger RoutedEvent="{Binding OnActivateGlow}"> 
       <BeginStoryboard Storyboard="{StaticResource ActivateGlow}"/>
    </EventTrigger>
</UserControl>

UnitView の分離コードには、次のものがあります。

public event EventHandler ActivateGlow;

MVVM ではよくあることですが、UnitViewModel には次の DataTemplate があります。

<DataTemplate DataType="{x:Type vm:UnitViewModel}">
    <vw:UnitView d:DesignWidth="150" d:DesignHeight="100" />
</DataTemplate>

最終的な質問は、viewmodel が OnActivateGlow イベントを発生できるようにするにはどうすればよいかということです。

4

4 に答える 4

12

更新:Firoso、コメントで述べたように、ブレンド動作コンポーネントを使用して要件をカバーできるはずです (つまり、テストされていないと思います)。

SDK のダウンロードとインストールに加えて。Expression Blend サンプルライブラリのコピーを取得します (次のリンクから [ダウンロード] をクリックする必要があります): Expression Blend サンプル

このライブラリには、ビューモデルで宣言されたイベントに応答してアクションをトリガーするために使用できる「DataEventTrigger」と呼ばれるビルド済みのトリガーが含まれています。

ブレンド SDK には、(私が知る限り) パズルのもう 1 つのピースが既にあります。これには、ストーリーボードを制御できるアクションが既に含まれています。このアクションの名前は「ControlStoryboardAction」です。

次のような xaml になるはずです。

    <i:Interaction.Triggers>
        <samples:DataEventTrigger EventName="YourEvent">
            <im:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}" 
                   ControlStoryboardOption="Play"/>
        </samples:DataEventTrigger>
    </i:Interaction.Triggers>

「YourEvent」をビューモデルで定義したイベントの名前に置き換え、「Storyboard1」をストーリーボードの名前に置き換えます。もちろん、名前は完全に一致する必要があります。

使用される xaml 名前空間の定義は次のとおりです。

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:samples="clr-namespace:Expression.Samples.Interactivity;assembly=Expression.Samples.Interactivity"

元の投稿、編集前:

Expression Blend の動作を調べることをお勧めします。

情報

ブレンド SDK

行動に関するビデオ

于 2010-01-03T21:09:09.893 に答える
6

ビューモデルにブールIsGlowingプロパティを配置し、スタイルでデータトリガーを使用することもできます

<Rectangle.Style>  
    <Style TargetType="{x:Type Rectangle}">  
        <Style.Triggers>  
            <DataTrigger Binding="{Binding Path=IsGlowing}" Value="True">  
                <DataTrigger.EnterActions>  
                    <BeginStoryboard>  
                        <Storyboard>  
                            ...  
                        </Storyboard>  
                    </BeginStoryboard>  
                </DataTrigger.EnterActions>  
            </DataTrigger>  
        </Style.Triggers>  
    </Style>  
</Rectangle.Style>  
于 2010-01-05T20:34:14.093 に答える
0

これを解決するために私が見つけた1つの方法は、上記のコントロールを含むDataTemplateでデータトリガーを使用することです...ただし、これを行うための最良の方法ではない可能性があります。私はまだより良いアイデアを受け入れています。

于 2010-01-04T18:15:03.730 に答える
0

RoutedEventCLR イベントではなく、インスタンスにバインドする必要があると思います。

私はそれを試していませんが、次のようなものがうまくいくはずです:

public class UnitView
{
    public static readonly RoutedEvent ActivateGlowEvent
        = EventManager.RegisterRoutedEvent(
              "ActivateGlow", RoutingStrategy.Bubble,
              typeof(RoutedEventHandler), typeof(UnitView)
          );

    public void RaiseActivateGlowEvent()
    {
        RaiseEvent(new RoutedEventArgs(ActivateGlowEvent));
    }
}
于 2009-09-14T23:11:01.227 に答える