我有一个按钮,有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中的按钮焦点?我不想用户点击按钮进入。
答案 0 :(得分:4)
Silverlight提供了一个内置的状态机来帮助您,称为Visual State Manager。尝试在这里提供一个完整的示例对我来说有点牵扯,但实际上,你可以明确地创建你的状态,每个状态都有一个状态值,一个持续时间为0的故事板,以及一个转换,可以是任意数量的动画。在状态中,您只需定义所需的控件状态 - 例如,您可以要求控件折叠等。在过渡中,您可以启动动画。此外,您可以使用自定义可视状态管理器绑定到状态,以便在状态更改时触发内容更改。
这里有一个很好的例子是从UI中清晰地分离代码,您只需转换到状态并将逻辑封装在其他地方。
关于VSM的更多阅读:
答案 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事件并将焦点直接传递给你想要聚焦的控件吗?