C# 如何确定按钮是由用户单击还是由代码单击?

C# 如何确定按钮是由用户单击还是由代码单击?,c#,wpf,C#,Wpf,我试图按如下方式触发单击事件: bool m=false; private void button1_Click(object sender, RoutedEventArgs e) { MessageBox.Show("button1 clicke!"); button1.Tag = "system"; ButtonAutomationPeer peer = new ButtonAutomationPeer(button1);

我试图按如下方式触发
单击事件

bool m=false;
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("button1 clicke!");
        button1.Tag = "system";
        ButtonAutomationPeer peer = new ButtonAutomationPeer(button1);
        IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
        if (m==false)
            for (int i = 0; i < 2; i++)
            {
                invokeProv.Invoke();
                m = true;
            }
    }
bool m=false;
私有无效按钮1\u单击(对象发送者,路由目标)
{
显示(“按钮1点击!”);
按钮1.Tag=“系统”;
ButtonAutomationPeer=新的ButtonAutomationPeer(button1);
IInvokeProvider invokeProvider=peer.GetPattern(PatternInterface.Invoke)作为IInvokeProvider;
如果(m==false)
对于(int i=0;i<2;i++)
{
invokeProv.Invoke();
m=真;
}
}
我只想显示此
MessageBox
三次。它工作正常,但当我再次单击此按钮时,
MessageBox
仅显示一次。

请尝试以下代码:

int i = 1;
private void button1_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("button1 clicked!");

    ButtonAutomationPeer peer = new ButtonAutomationPeer(button1);
    IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
    i++;
    if (i != 4)
    {
        invokeProv.Invoke();
    }
    else
    {
        i = 1;
    }
}

XAML、WPF和UWP的设计考虑了MVVM模式。虽然您可以使用其他方法,但这样做会损失大约90%的XAMLs能力,并且每隔一点就会遇到问题。这看起来根本不像MVVM模式。几年前,我在MVVM中写了一篇介绍文章,这应该会让你开始:为不使用MVVM的人提供的调试帮助充其量是有限的然后在
内单击按钮名称的事件检查谢谢您的回答,您能在示例中解释您的解决方案吗?它应该不受来自何处(用户或代码)的影响。如果是这样,您应该为代码生成的单击创建一个不同的事件(或者只使用按钮上的公共方法来调用),并使用私有方法共享公共代码。或者您是否计划使用大量if/else构造来基于原点进行操作?这对我来说似乎是个坏主意。