gpt4 book ai didi

wpf - 实现 UI 状态机的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-04 14:24:35 25 4
gpt4 key购买 nike

在我的程序中,我有三种不同的 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
}

现在,您可以通过直接绑定(bind)或触发器来更改窗口任何元素(包括窗口本身)的几乎任何属性。这是通过属性触发器更改窗口背景颜色的示例:
<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>

关于wpf - 实现 UI 状态机的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/719779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com