Состояние переключения (C # / Windows Forms) - PullRequest
1 голос
/ 10 июня 2011

Поэтому я подумал, что перечисление поможет мне с состояниями. По сути, у меня есть небольшое приложение боковой панели, которое имеет 3 состояния:

Свернутый - где вы можете увидеть маленькую цветную прямоугольную панель, указывающую, что приложение открыто на рабочем столе.

Preview - в котором указано, что приложение открыто, и вы можете увидеть логотип.

Обычный - там, где видна вся боковая панель.

Теперь я настроил перечисление следующим образом:

public enum CurrentState
{
    Minimized = 0,
    Preview,
    Normal
};

И я пытаюсь проверить CurrentState и переключиться на другое, как это, когда пользователь нажимает на всегда видимую панель:

    // If Min=Set(Preview). If Preview=Set(Normal). If Normal=Set(Min).
    if (State.HasFlag(CurrentState.Minimized))
    {
        State = CurrentState.Preview;
        this.Location = new Point(
            Screen.PrimaryScreen.WorkingArea.Right - _minimize.Size.Width - _logo.Size.Width,
            this.Location.Y
        );
    }
    else if (State.HasFlag(CurrentState.Preview))
    {
        State = CurrentState.Normal;
        this.Location = new Point(
            Screen.PrimaryScreen.WorkingArea.Right - this.Size.Width,
            this.Location.Y
        );
    }
    else
    {
        State = CurrentState.Minimized;
        this.Location = new Point(
            Screen.PrimaryScreen.WorkingArea.Right - _minimize.Size.Width,
            this.Location.Y
        );
    }

И когда приложение загружается, я устанавливаю начальное значение:

CurrentState.Minimized ;, вот так:

CurrentState State = CurrentState.Preview;

Итак, это ожидаемое поведение:

Если форма свернута, переместите ее немного, чтобы она была в режиме предварительного просмотра. Если он находится в режиме предварительного просмотра, переместите его немного, чтобы он находился в обычном режиме. Если он находится в обычном режиме, снова установите значение Minimized.

Но при первом нажатии на всегда видимую панель она работает как положено. Он устанавливает его в режим предварительного просмотра и немного переместил форму.

Но , это так далеко. Когда он находится в режиме предварительного просмотра, он не переходит в обычный режим после повторного нажатия на панель, что означает, что в настоящее время невозможно вернуть его в обычный вид.

Я что-то здесь не так делаю?

Хотя это может быть необычно, это логично, и я не могу понять, где что-то идет не так.

Вот небольшое визуальное представление, чтобы лучше уточнить, что я имею в виду:

enter image description here

Ответы [ 3 ]

2 голосов
/ 10 июня 2011

Ваша проблема HasFlag.Вы никогда не достигнете условия else, потому что ваше перечисление ВСЕГДА имеет флаг Minimized, равный 0.

Проверка на равенство в ваших if утверждениях: if (State == CurrentState.Minimized) ...

2 голосов
/ 10 июня 2011

Код, который у вас есть, всегда входит в минимизированную ветвь структуры if / else.

Код ниже, который не использует флаги, а вместо этого сравнивает перечисления, работает правильно и проходит через состояния какВы хотите:

if (State == CurrentState.Minimized)    
{        
    State = CurrentState.Preview;                        
}    
else if (State == CurrentState.Preview)    
{        
    State = CurrentState.Normal;                        
}    
else    
{        
    State = CurrentState.Minimized;                        
}

Одна мысль, которая, вероятно, облегчит работу с этим дизайном, заключается в реализации шаблона State .

в качестве имени.предполагает, что этот шаблон проектирования имеет дело именно с ситуацией, которую вы пытаетесь решить.

По сути, логика для ваших трех состояний будет разделена на три отдельных объекта, которые реализуют что-то вроде IWindowState, где состояние IWindow включает методназывается MoveState.Когда вызывается MoveState, объект состояния для свернутого окна знает, что следующим состоянием является Предварительный просмотр, а объект предварительного просмотра знает, что должен перейти в обычный режим.

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

1 голос
/ 10 июня 2011

Вы используете неправильный флаг.(Или ваши перечисления неверны)

Если вы используете флаги, перечисление должно быть

[Flags]
public enum CurrentState
{
    Unknown = 0,
    Minimized = 1,
    Preview = 2,
    Normal = 4
};

Более подробную статью о флагах можно найти здесь и здесь

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