Silverlight中的三个状态按钮

时间:2010-08-17 08:37:30

标签: c# wpf silverlight design-patterns

我有一个按钮,有3个状态开始/恢复/暂停。
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 个答案:

答案 0 :(得分:4)

Silverlight提供了一个内置的状态机来帮助您,称为Visual State Manager。尝试在这里提供一个完整的示例对我来说有点牵扯,但实际上,你可以明确地创建你的状态,每个状态都有一个状态值,一个持续时间为0的故事板,以及一个转换,可以是任意数量的动画。在状态中,您只需定义所需的控件状态 - 例如,您可以要求控件折叠等。在过渡中,您可以启动动画。此外,您可以使用自定义可视状态管理器绑定到状态,以便在状态更改时触发内容更改。

这里有一个很好的例子是从UI中清晰地分离代码,您只需转换到状态并将逻辑封装在其他地方。

关于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 :(得分:1)

您是否考虑过使用状态机对此进行建模?

目前,您在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事件并将焦点直接传递给你想要聚焦的控件吗?

相关问题