2010-12-06 3 views
3

私たちはPrismベースのSilverlightアプリケーションを作成しています。私たちは、別々のモジュールにページをたくさん用意しています。2つ(またはそれ以上)のXAMLファイル間でVisualStateManagerを共有するにはどうすればよいですか?

ページ間の遷移は、ナビゲーションイベントを介して処理され、各モジュールは、ナビゲート時にページを表示してからナビゲートするとき、それを隠すために実装され、次のメソッドがあります。

public void Show() 
{ 
    VisualStateManager.GoToState(this, "ShowState", true); 
} 

public void Hide() 
{ 
    VisualStateManager.GoToState(this, "HideState", true); 
} 

瞬間に「ShowState」と"HideState"は各モジュールのXAMLファイルで定義されているので、何回も重複しています。 ...各遷移のためStoryboardを表す

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="VisualStates"> 
      <VisualState x:Name="ShowState"> 
       ... 
      </VisualState> 
      <VisualState x:Name="HideState"> 
       ... 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

私はちょうどStoryboardの定義でエラーを発見しましたが、今はすべてのファイルにわたって修正を複製する必要があります。各ファイルで参照可能なStoryboardの定義が1つだけだった方が良いでしょう。

私は徹底的に正しい構文を検索しましたが、運がまったくなかったのです。

このVisualStateManagerをすべてのXAMLファイルに共有するにはどうすればよいですか?

+0

カスタムコントロール内で「動作」をカプセル化したいようです。そうすれば、必要に応じてコントロールを再利用するだけで、ストーリーボードをカプセル化し、発生した問題を修正するための単一の参照ポイントを提供します。私の推測では、これはExpanderなどに似たものです。そのコンテナ内のすべての子に共通の機能を提供します。 –

答えて

2
<Storyboard x:Key="ShowStoryboard"> 
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

<VisualState x:Name="ShowState"> 
    <BeginStoryboard Storyboard="{StaticResource ShowStoryboard}"/> 
</VisualState> 

上記のようにXAML内でストーリーボードを参照することができます。一番上の部分は、どこかのリソースとしてストーリーボードに保存されています。その後、VisualState内のBeginStoryboardリファレンスを使用できるようになります。

編集:上記はWPF内で可能ですが、SLでは可能ではありません。現時点では、SLの中ではStoryboardまたはVisualStateを再利用する能力はありません。カスタムコントロールに適用されたスタイル内でVisualStateManagerの動作をカプセル化することで、やっていることを達成できるはずです。これは、あなたが探している単一障害点を提供します。

+0

私は 'VisualStateManager'全体を参照したいと思っていましたが、' Storyboard'定義は1か所にあります; – ChrisF

+1

これは動作しません。 'BeginStoryboard'は有効なXAMLとして認識されません。単に' 'を実行すると、初期化時にエラーが発生します。 – ChrisF

+0

@ChrisF BeginStoryboardは実際にSL内でアクティブです。しかし、それはトリガーの中では限られたものしかなく、おそらくはVisualState内で受け入れられない(WPFにある)のですが、それ以外のものを見てみましょう。 –

関連する問題