5

私のプログラムでは、3 つの異なる UI 状態 (通常、成功、エラー) があり、それぞれにコントロールが表示/非表示、有効/無効、色が変わり、ラベルが異なることを言うなど. 私の分離コードでは、基本的に ChangeWindowState(UI.Normal); と言えるようにしたいと考えています。

だから私の質問は、各状態の制御の変更をどのように実装するのが最善ですか?

もちろん、コード ビハインドのコントロールを手動で変更することもできますが、wpf テーマまたはスタイルを使用することで、より良い方法があるのではないかと思います。次に、事前に定義した「エラー」テーマを使用するようにウィンドウを設定できます。現時点ではよくわからないので、用語を間違って使用している可能性がありますが、このようなことを行う最善の方法を誰かが正しい方向に向けてくれれば幸いです.

ありがとう!

4

3 に答える 3

5

もちろん、これにアプローチする方法はたくさんあります。プログラム状態の「オブジェクト モデル」がある場合は、DataTemplates と DataTriggers を組み合わせて使用​​できます。これが当てはまらないと仮定すると、別のアプローチがあります。ウィンドウを参照したので、ウィンドウ クラスで「依存関係プロパティ」を次のように定義するとします。

public partial class Window1 : Window
{
    public Window1()
    {
        this.InitializeComponent();

        // Insert code required on object creation below this point.
    }

    public ProgramStatus ProgramStatus
    {
        get { return (ProgramStatus)GetValue(ProgramStatusProperty); }
        set { SetValue(ProgramStatusProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ProgramStatus.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ProgramStatusProperty =
        DependencyProperty.Register("ProgramStatus", typeof(ProgramStatus), typeof(Window1), new UIPropertyMetadata(null));
}

public enum ProgramStatus
{
    Normal,
    Success,
    Error
}

これで、ウィンドウの任意の要素 (ウィンドウ自体を含む) のほぼすべてのプロパティを、直接バインディングまたはトリガーによって変更できるようになりました。プロパティ トリガーを介してウィンドウの背景色を変更する例を次に示します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:Test"
    x:Class="Test.Window1"
    x:Name="Window"
    Title="Window1"
    Width="640" Height="480">
    <Window.Style>
        <Style TargetType="{x:Type l:Window1}">
            <Style.Triggers>
                <Trigger Property="ProgramStatus">
                    <Trigger.Value>
                        <l:ProgramStatus>Error</l:ProgramStatus>
                    </Trigger.Value>
                    <Setter Property="Background" Value="Red" />
                </Trigger>
                <Trigger Property="ProgramStatus">
                    <Trigger.Value>
                        <l:ProgramStatus>Normal</l:ProgramStatus>
                    </Trigger.Value>
                    <Setter Property="Background" Value="Blue" />
                </Trigger>
                <Trigger Property="ProgramStatus">
                    <Trigger.Value>
                        <l:ProgramStatus>Success</l:ProgramStatus>
                    </Trigger.Value>
                    <Setter Property="Background" Value="Green" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Style>
    <Grid x:Name="LayoutRoot"/>
</Window>
于 2009-04-05T23:11:44.333 に答える
3

別のオプションは、WPFToolkit の一部としてリリースされた VisualStateManager です。

詳細については、次のリンクを参照してください。

幸運を。

于 2009-04-07T14:48:08.830 に答える
1

この種のことのために、私はほとんど常に「UpdateUI()」関数を実行してきました。この関数は、モデル/メンバーのプロパティ/状態の状態を見て、有効/無効、非表示/表示などを行います。このコードを広めようとすると、常に問題が発生します (したがって、"ChangeWindowsState(..)" は実際にはプロパティを設定してから "UpdateUI()" を呼び出すだけです)。

これを一般的な方法で処理しようとする試みをいくつか見てきましたが、本当に気に入ったものはありませんでした (たとえば、WTL のもの)。一般に、これらの実装は悪くはありませんが、できることを簡単に超えることができます。そして一般的に、状態ロジックは十分に重要であり、シンプルな if/then/else スタイルのロジックで明示的にコード化することで、混乱 (メンテナンス、デバッグなど) を減らすことができます。

于 2009-04-05T22:51:32.400 に答える