1. 程式人生 > >WPF利用程式碼觸發按鈕點選操作

WPF利用程式碼觸發按鈕點選操作

在WPF開發過程中,某些場景下,需要模擬點選按鈕進行某些操作,也就是用程式碼呼叫某些介面,實現對於按鈕的點選。但是Button控制元件提供的介面中並沒有這樣的方法,它只提供了Click事件。解決辦法如下:

ButtonAutomationPeer peer =
  new ButtonAutomationPeer( someButton );

IInvokeProvider invokeProv =
  peer.GetPattern( PatternInterface.Invoke )
  as IInvokeProvider;

invokeProv.Invoke();

對於ToggleButton而言,解決辦法如下:
                ToggleButtonAutomationPeer peer = new ToggleButtonAutomationPeer(someButton);
                System.Windows.Automation.Provider.IToggleProvider toggleProvider = peer.GetPattern(PatternInterface.Toggle) as System.Windows.Automation.Provider.IToggleProvider;
                toggleProvider.Toggle();

但是對於ToggleButton,在我的程式中,呼叫上述程式碼,發現程式沒有反應。經過調查主要原因如下,我的ToggleButton控制元件的IsChecked屬性綁定了後臺的資料,並設定了繫結模式為OneWay。

問題在於這個繫結模式上,如果採用預設的繫結模式,上述的程式碼沒有問題,能夠正常的工作,但是如果採用的是OneWay的繫結模式,上述程式碼並不能讓ToggleButton實現點選操作。

原因應該是上述程式碼的內部實現上,最終要設定IsChecked屬性,但是由於繫結模式設定是OneWay,即只能有繫結的資料來決定IsChecked的數值,因此程式碼設定IsChecked是不會有效果的,從而使得上述的程式碼執行後沒有任何反應。

由於程式功能的要求,不可以修改繫結模式,但同時又要實現程式化點選按鈕操作的效果,最後我的解決辦法是,為ToggleButton定義Command繫結,需要程式化點選ToggleButton時,直接呼叫ToggleButton的Command繫結實現。核心思路就是引入Command繫結,使得按鈕點選和程式化執行的響應函式是同一個,從而變相的實現了模擬按鈕點選的效果。