C# 有没有一种方法可以假装从一个开关按钮上的手柄检查永远不会发生?

C# 有没有一种方法可以假装从一个开关按钮上的手柄检查永远不会发生?,c#,wpf,C#,Wpf,我正在开发一个程序,它通过SSH将我的客户机连接到服务器。我在wpf中为连接/断开连接功能使用切换按钮。我想实现这样的功能,当我按下切换按钮而它无法连接时,按钮应该返回到其原始状态,“未选中” 我用toggle\u btn.IsChecked=false尝试了它将按钮设置为未按下状态。但是,它仍然运行代码,就像我取消选中它一样,这是我不想要的。我只想让按钮假装什么都没发生,这样用户就可以验证他的密码,然后再试一次 private void HandleCheck(object sender,

我正在开发一个程序,它通过
SSH
将我的客户机连接到服务器。我在
wpf
中为连接/断开连接功能使用切换按钮。我想实现这样的功能,当我按下切换按钮而它无法连接时,按钮应该返回到其原始状态,“未选中”

我用
toggle\u btn.IsChecked=false尝试了它将按钮设置为未按下状态。但是,它仍然运行代码,就像我取消选中它一样,这是我不想要的。我只想让按钮假装什么都没发生,这样用户就可以验证他的密码,然后再试一次

 private void HandleCheck(object sender, RoutedEventArgs e)
        {
          //connection to the ssh client
                    if (capt.Connect(str.Split(';')[0], 22, str.Split(';')[1], 
                    str.Split(';')[2]) == false)
            {                 
                    btn_con.IsChecked = false;
              }

        }

如果我使用
.IsChecked
,它将运行
HandleUnchecked
函数中包含的代码。但是,您不能断开从未连接过的东西,这就是它引发异常的原因。我可以捕获这个异常,但是我想知道是否有更好的方法阻止代码执行


        private void HandleUnchecked(object sender, RoutedEventArgs e)
        {
            capt.DisconnectSSH();
        }

我认为您可以删除和添加取消选中事件。并在GUI中延迟反转事件

private void ToggleButton_Checked(object sender, RoutedEventArgs e)
        {
            // IF condition
            {
                Task.Run(() =>
                {
                    Thread.Sleep(500);
                    Dispatcher.Invoke(() =>
                    {
                        tgButton.Unchecked -= tgButton_Unchecked;
                        tgButton.IsChecked = false;
                    });                 
                }).
                ContinueWith((tsk) =>
                {
                    tgButton.Unchecked += tgButton_Unchecked;
                });
            }
        }

设置IsChecked=false后;做一个e.Handled=true;它应该是有效的,你应该在你的类中有一个属性,知道你是否连接。类似于
if(capt.IsConnected)capt.DisconnectSSH()@NawedNabiZada将不起作用,因为它将处理错误的事件,而不是由IsChecked PropertyOk的更改引起的新创建的事件。也许我不明白这个问题。我刚刚意识到有一个已处理和未处理的事件。也许在IF/ELSE语句中完成这整件事会给您带来所需的行为。如果不处理未检查的事件,两个事件都将路由到已检查的事件。@DenisSchaf嘿,谢谢,我已经使用该属性来验证连接是否存在。但是,我总是收到SFTP客户端的NullReferenceException。这就是我试图保留事件曾经发生的原因。我认为使用
async
/
await
可以大大简化这一过程。您不必担心手动旋转任务或编组UI调用。@BradleyUffner:我尝试了aync并等待并删除了线程。Sleep(500);但切换按钮的行为类似于未按下。为了获得压缩和反转效果,我添加了Thread.Sleep(500);。要使
async
/
Wait
工作,您需要将
线程.Sleep
转换为
任务.Wait