如何通过编程方式推动一个ToggleButton?

3
我有这样一段可以编程按下按钮的代码,但我希望有一个可以用于ToggleButton的版本。
public static void PushButton(Button b)
{
     ButtonAutomationPeer peer = new ButtonAutomationPeer(b);
     System.Windows.Automation.Provider.IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as System.Windows.Automation.Provider.IInvokeProvider;
     invokeProv.Invoke();
}

我尝试使用ToggleButtonAutomationPeer...

public static void PushButton(ToggleButton b)
{
  ToggleButtonAutomationPeer peer = new ToggleButtonAutomationPeer(b);
  System.Windows.Automation.Provider.IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as System.Windows.Automation.Provider.IInvokeProvider;

//But invokeProv is null.   Peer is ok. 
}

我知道那是个问题,但你真的需要这样做吗?如果你通过绑定和命令等方式,可以让你的生活变得更轻松一些 - 但我不知道全部情况,只是在核实一下 :) - NSGaga-mostly-inactive
2个回答

10
你可以使用Toggle Button Automation Peer
public static void PushToggleButton(ToggleButton b)
{
    ToggleButtonAutomationPeer peer = new ToggleButtonAutomationPeer(b);
    System.Windows.Automation.Provider.IToggleProvider toggleProvider = peer.GetPattern(PatternInterface.Toggle) as System.Windows.Automation.Provider.IToggleProvider;
    toggleProvider.Toggle();
}

我在 System.Windows.Automation.Provider 上遇到了一个错误 (The type or namespace name 'Provider' does not exist in the namespace 'System.Windows.Automation' (are you missing an assembly reference?))。 - Pac0
它能工作,但不知何故与手动按下切换按钮的效果并不完全相同。不过这是一个有趣的模式,我想知道为什么微软没有选择添加一个 .Toggle() 帮助方法 :-D - Bent Rasmussen

-1

另一种方法是在按钮上触发ClickEvent事件。

//check that the button is untoggled
if (this.MyToggleButton.IsChecked == false)
{
    //set button toggled
    this.MyToggleButton.IsChecked = true;
    //then raise a click evt
    this.MyToggleButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
}

假设MyToggleButton是在代码后台或通过x:Name在xaml中定义的ToggleButton


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接