문제

내 프로그램에는 3 개의 별개의 UI 상태 (정상, 성공 및 오류)가 있으며 각 컨트롤에는 컨트롤이 표시/숨겨지고, 활성화/비활성화되며, 색상이 변경되고 레이블이 다른 것들을 말합니다 ... 등. 그리고 내 코드-비만에서 나는 기본적으로 changewindowstate (ui.normal)를 말할 수 있기를 원합니다.

제 질문은 각 주에 대한 제어 변경을 가장 잘 구현하는 방법입니다.

물론 코드 베어드에서 컨트롤을 수동으로 변경할 수는 있지만 WPF 테마 나 스타일을 사용하여 더 나은 방법이 있는지 궁금합니다. 그런 다음 사전 정의 된 "오류"테마를 사용하도록 창을 설정할 수 있습니다. 나는 현재 그들을 이해하지 못하기 때문에 용어를 잘못 사용하고 있을지 모르지만 누군가가 이런 일을 가장 잘하는 방법을 올바른 방향으로 가리킬 수 있다면 감사하겠습니다.

감사!

도움이 되었습니까?

해결책

물론 이것에 접근하는 방법에는 여러 가지가 있습니다. 프로그램 상태 "객체 모델"이있는 경우 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>

다른 팁

당신을위한 또 다른 옵션은 WPFToolkit의 일부로 출시 된 VisualStateManager입니다.

자세한 정보는 다음 링크를 통해 다음과 같습니다.

행운을 빕니다.

이런 종류의 것에 대해 나는 항상 "updateui ()"함수를 거의 수행했습니다. 이 기능은 모델/멤버 속성/상태의 상태를 살펴보고 모든 것을 활성화/비활성화, 가죽/표시 등을 활성화합니다. 이 코드를 전파하려고 시도하면 항상 문제가 발생합니다 (따라서 "ChangeWindowsState (..)"은 실제로 속성을 설정 한 다음 "updateUi ()"이라고 부릅니다.

나는 이것을 일반적인 방식으로 처리하려는 몇 가지 시도를 보았지만 ... 내가 정말로 좋아하지 않았던 것은 없다 (예 : WTL 물건). 일반적으로 이것들은 심하게 구현되지는 않지만 그들이 할 수있는 일을 신속하게 초과하기 쉽습니다. 그리고 일반적으로 상태 논리는 간단한 if/when/else 스타일 로직으로 명시 적으로 코딩하는 것이 혼란 (유지 보수, 디버깅 등)으로 이어질 정도로 중요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top