2010-08-17 60 views
1

我有一個按鈕,其中有3個狀態開始/恢復/暫停。
1這是一個很好的模式來解決這個問題,或者有一些切換按鈕模式,我不知道?Silverlight中的三個狀態按鈕

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中按鈕的焦點?我不想用戶點擊按鈕按回車。

回答

4

Silverlight提供了一個內置的狀態機來幫助你,稱爲視覺狀態管理器。對我來說,嘗試在這裏提供一個完整的示例有點涉及,但實質上,你可以明確地創建你的狀態,並且每個狀態都有一個狀態值,這是一個持續時間爲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

+0

thx很多我新來的Silverlight :) – 2010-08-17 16:03:00

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事件並將焦點直接傳遞給您想要關注的控件?

+0

好的片段。 thx – 2010-08-17 16:57:08