2009-04-05 5 views
5

내 프로그램에는 세 가지 별개의 UI 상태 (Normal, Success 및 Error)가 있고 컨트롤마다 표시/숨김, 활성화/비활성화, 색상 변경, 레이블이 다른 것들 ... 등등이 있습니다. 내 코드 숨김에서 기본적으로 ChangeWindowState (UI.Normal)를 말할 수 있기를 원합니다.UI 상태 시스템을 구현하는 가장 좋은 방법은 무엇입니까?

제 질문은 각 상태에 대한 컨트롤 변경을 구현하는 가장 좋은 방법입니까?

물론 코드 숨김의 컨트롤을 수동으로 변경할 수는 있지만 wpf 테마 나 스타일을 사용하면 더 좋은 방법이 있는지 궁금합니다. 그러면 미리 정의한 "오류"테마를 사용하도록 창을 설정할 수 있습니다. 나는 그 순간을 정말로 이해하지 못하기 때문에 용어를 잘못 사용하고 있을지 모르지만 다른 누군가가 올바른 방향으로 나를 가리켜 주면 고맙겠습니다.

감사합니다.

답변

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> 
1

"UpdateUI()"기능을 거의 다 수행했습니다. 이 함수는 모델/멤버 속성/상태의 상태를보고 활성화/비활성화, 숨기기/표시 등을 수행합니다. 이 코드를 퍼뜨리려고하면 항상 문제가 발생합니다 ("ChangeWindowsState (..)"는 실제로 속성을 설정 한 다음 "UpdateUI()"를 호출합니다).

일반적인 방법으로이 문제를 처리하려는 몇 가지 시도를 보았습니다 ...하지만 실제로 내가 좋아했던 것은 없습니다 (예 : WTL 항목). 일반적으로 이들은 잘못 구현되지는 않았지만 할 수있는 일을 빠르게 초과하는 것은 쉽습니다. 그리고 일반적으로 상태 로직은 중요한 if/then/else 스타일 논리로 명시 적으로 코딩하면 혼란을 줄여줍니다 (유지 보수, 디버깅 등).

관련 문제