1

私のアプリケーション (MVVM Light) は、メイン ウィンドウのサイズを変更します (非表示にしてアニメーションで表示します)。アニメーションには、StaticResources からのパラメーターを持つ DataTrigger を使用します。

<Window.Resources>
    <system:Double x:Key="WindowMaxWidth">400</system:Double>
    <system:Double x:Key="WindowMinWidth">25</system:Double>
</Window.Resources>
<Window.Style>
    <Style TargetType="Window">
        <Style.Triggers>
            <DataTrigger Binding="{Binding DropBox.IsShown}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
                                             To="{StaticResource WindowMaxWidth}"
                                             Duration="0:0:0:0.2"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
                                             To="{StaticResource WindowMinWidth}"
                                             Duration="0:0:0:0.2"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Style>

私のViewModelでは、ウィンドウの幅の値が必要なので、それをバインドしました。問題は、デフォルトで 0 であるため、値で初期化する必要があることです。実際に必要なのは、私の静的リソースからの値です: WindowMaxWidth

  1. DataTriggr がバインディングを受け入れないため (スレッドについて不平を言う)、WindowMaxWidth の値を ViewModel に移動できません。
  2. 不整合を避けるために、StaticResources と ViewModel で同じ値を別々に保持したくありません。

私は何をすべきか?

4

2 に答える 2

2

WindowMaxWidthビューモデルにとを入れて、次WindowMinWidthのように参照しますx:Static

namespace MyNamespace
{
   class ViewModel
   {
      public static double WindowMaxWidth = 400;
      public static double WindowMinWidth = 25;
   }
}

適切な名前空間をインポートするxmlns:myns="clr-namespace:MyNamespace"

<DoubleAnimation Storyboard.TargetProperty="Width"
    To="{x:Static myns:ViewModel.WindowMaxWidth}"
    Duration="0:0:0:0.2"/>
于 2013-11-09T21:30:21.123 に答える
0

このような方法で分離コードを使用できます (たとえば、DataContext を ViewModel に設定した後、コンストラクターで)。

(this.DataContext as MyViewModel).MyWindowWidth = (double)this.FindResource("WindowMaxWidth");
于 2013-11-09T21:40:48.967 に答える