Каков наилучший способ реализации конечного автомата пользовательского интерфейса? - PullRequest
5 голосов
/ 06 апреля 2009

В моей программе есть три различных состояния пользовательского интерфейса («Нормальный», «Успешный» и «Ошибка»), и в каждом из них элементы управления видимы / скрыты, включены / отключены, цвета меняются, метки говорят о разных вещах ... и т. Д. и в моем коде позади я в основном хочу сказать ChangeWindowState (UI.Normal);

Итак, мой вопрос, как лучше всего реализовать изменения управления для каждого состояния?

Конечно, я мог бы вручную изменить элементы управления в выделенном фрагменте кода, но мне интересно, может быть, есть ли лучший способ, используя темы или стили wpf. Тогда, возможно, я мог бы просто установить окно, чтобы использовать тему «Ошибка», которую я предопределил. Я на самом деле не понимаю их в данный момент, поэтому я могу неправильно использовать терминологию, но я был бы признателен, если бы кто-то мог указать мне правильное направление, как лучше всего сделать что-то подобное.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 06 апреля 2009

Конечно, есть много способов приблизиться к этому. Если бы у вас была «объектная модель» состояния программы, вы могли бы использовать некоторую комбинацию 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>
3 голосов
/ 07 апреля 2009

Другой вариант для вас, возможно, VisualStateManager, который был выпущен как часть WPFToolkit.

Больше информации по этим ссылкам:

Удачи.

1 голос
/ 06 апреля 2009

Для такого рода вещей я всегда выполнял функцию UpdateUI (). Эта функция просматривает состояние модели / свойств / состояния элемента и включает / отключает, скрывает / показывает, что угодно. Попытка распространить этот код всегда приводит к проблеме (поэтому «ChangeWindowsState (..)» на самом деле просто устанавливает свойство и затем вызывает «UpdateUI ()»).

Я видел несколько попыток обработать это в общем виде ... но ни одной, которая мне действительно понравилась (например, материал WTL). Как правило, они не плохо реализованы ... но просто легко превзойти то, что они могут сделать. И вообще логика состояния достаточно важна, чтобы ее явное кодирование с простой логикой в ​​стиле if / then / else приводило к меньшему количеству путаницы (обслуживание, отладка и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...