Кнопка трех состояний в Silverlight - PullRequest
1 голос
/ 17 августа 2010

У меня есть кнопка с 3 состояниями Start / Resume / Pause.1 Это хороший шаблон для решения этой проблемы или, может быть, есть какой-то режим переключения кнопок, о котором я не знаю?

private void cmdStart_Click(object sender, RoutedEventArgs e)
    {
        if (m_end)
        {
            // Reset the game.
            m_end = false;
            cmdStart.Content = "Pause Game";
            // Update the display.
        }
        else
        {
            if (m_pause)
            {
                m_bombTimer.Start();
                foreach (var storyboard in m_storyboards)
                {
                    // resume all animations
                }
                status.Visibility = System.Windows.Visibility.Collapsed;
                m_pause = false;
                cmdStart.Content = "Pause Game";
            }
            else
            {
                m_bombTimer.Stop();
                foreach (var storyboard in m_storyboards)
                {
                    // pause all animations
                }
                status.Visibility = System.Windows.Visibility.Visible;
                cmdStart.Content = "Resume Game";
                m_pause = true;
            }
        }

2 Как избавиться от фокуса кнопки в Silverlight?Я не хочу, чтобы пользователь нажимал кнопку ввода.

Ответы [ 2 ]

4 голосов
/ 17 августа 2010

Silverlight предоставляет встроенный конечный автомат, который называется Visual State Manager.Мне было бы немного сложно попытаться предоставить здесь полный образец, но, по сути, вы можете явно создавать свои состояния, и каждое состояние имеет значение состояния, которое представляет собой раскадровку продолжительностью 0, и переход, который может бытьлюбое количество анимаций.В состояниях вы просто определяете желаемые состояния элемента управления - например, вы можете попросить свернуть элемент управления и т. Д. В переходах вы можете запустить анимацию.Кроме того, вы можете связать состояния с помощью настраиваемого визуального диспетчера состояний, чтобы при изменении состояний вы инициировали изменения содержимого.

Что приятно, так это чистое отделение кода от пользовательского интерфейса, и вы простопереход к состояниям и инкапсуляция логики в другом месте.

Подробнее о VSM:

http://blogs.infosupport.com/blogs/alexb/archive/2010/04/02/silverlight-4-using-the-visualstatemanager-for-state-animations-with-mvvm.aspx

http://blogs.silverlight.net/blogs/justinangel/archive/2008/12/25/custom-vsm-visualstatemanagers-in-silverlight-2-0.aspx

1 голос
/ 17 августа 2010

Задумывались ли вы о моделировании этого состояния с помощью конечного автомата?

В настоящий момент вся ваша работа обрабатывается в событии Click, но событие click должно быть простым при работе с конечным автоматом:

public class RunStateController
{
   public RunState CurrentState { get; private set; }

   public void Start()
   {
       // reset everything
       Run();
   }

   public void Run() 
   {
       State = new RunningState();
       // do the running code here
   }

   public void Pause()
   {
      State = new PausedState();
      // do the pause logic here
   }
}
public abstract class RunState
{
   public abstract void Change(RunStateContext context);
}

public class StartState : RunState
{
   public override void Change(RunStateContext context)
   {
      context.Run();
   }
}

public class RunningState : RunState
{
   public override void Change(RunStateContext context)
   {
      context.Run();
   }
}

public class Form....
{
   private void cmdStart_Click(object sender, RoutedEventArgs e)
   {
      m_controller.CurrentState.Change();
   }

}

В ответ на (2) - вы только что пытались обработать событие GotFocus и передать фокус прямо на элемент управления, на котором хотите сфокусироваться?

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