UI 상태 머신을 구현하는 가장 좋은 방법은 무엇입니까?
-
23-08-2019 - |
문제
내 프로그램에는 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입니다.
자세한 정보는 다음 링크를 통해 다음과 같습니다.
- VSM 개요 :http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-visual-state-manager-overview.aspx
- CodePlex의 WPFToolkit :http://www.codeplex.com/wpf
행운을 빕니다.
이런 종류의 것에 대해 나는 항상 "updateui ()"함수를 거의 수행했습니다. 이 기능은 모델/멤버 속성/상태의 상태를 살펴보고 모든 것을 활성화/비활성화, 가죽/표시 등을 활성화합니다. 이 코드를 전파하려고 시도하면 항상 문제가 발생합니다 (따라서 "ChangeWindowsState (..)"은 실제로 속성을 설정 한 다음 "updateUi ()"이라고 부릅니다.
나는 이것을 일반적인 방식으로 처리하려는 몇 가지 시도를 보았지만 ... 내가 정말로 좋아하지 않았던 것은 없다 (예 : WTL 물건). 일반적으로 이것들은 심하게 구현되지는 않지만 그들이 할 수있는 일을 신속하게 초과하기 쉽습니다. 그리고 일반적으로 상태 논리는 간단한 if/when/else 스타일 로직으로 명시 적으로 코딩하는 것이 혼란 (유지 보수, 디버깅 등)으로 이어질 정도로 중요합니다.