C# 在点击键盘上的enter键触发单击事件之前,我可以使用哪个事件触发标签更新?

C# 在点击键盘上的enter键触发单击事件之前,我可以使用哪个事件触发标签更新?,c#,.net,xaml,button,click,C#,.net,Xaml,Button,Click,我有一个应用程序,当点击一个按钮时,它会做一些非常复杂的计算。我仍在努力提高代码的效率,但同时我想给用户反馈,通过更新UI上的标签来显示按钮已被单击,并且计算正在进行中 直到点击事件完成,UI才会更新,因此我必须将代码放入一个事件中,该事件在触发点击事件代码之前调用 到目前为止,我使用的是PreviewMouseLeftButtonDown事件,在执行click事件之前调用该事件来更新标签。这适用于鼠标点击。 但是,如果用户在按钮处于焦点时单击Enter,则显示为从未触发PreviewKeyDo

我有一个应用程序,当点击一个按钮时,它会做一些非常复杂的计算。我仍在努力提高代码的效率,但同时我想给用户反馈,通过更新UI上的标签来显示按钮已被单击,并且计算正在进行中

直到点击事件完成,UI才会更新,因此我必须将代码放入一个事件中,该事件在触发点击事件代码之前调用

到目前为止,我使用的是
PreviewMouseLeftButtonDown
事件,在执行click事件之前调用该事件来更新标签。这适用于鼠标点击。
但是,如果用户在按钮处于焦点时单击Enter,则显示为从未触发
PreviewKeyDown
KeyDown
事件,或者至少在触发Click事件之前未触发

当按下enter键时,我可以使用什么事件来更新标签,或者您知道在运行Click事件的代码之前,我可以使用其他方法更新标签吗

更新:我注意到
PreviewKeyDown
事件在
click
事件之前被触发,但我没有看到标签在
click
事件代码运行之前被更新。我看不出我的代码有什么问题

    private void Button1_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.Key == Key.Return || e.Key == Key.Enter)
            {
                lblMessage.Content = "Loading...";
            }
        }
        catch (Exception)
        {

        }
    }

为什么不使用按钮的命令属性而不是事件

该命令由鼠标单击或enter键触发

Xaml:


我正在使用Josh Smith提供的RelayCommand,您可以尝试使用它在编辑标签后强制更新标签。这样,您就不必担心绑定不同的事件—只需更改您需要的任何内容,调用
.Refresh()
,然后开始主要处理。

我理解您的困境,我听起来好像您正在用业务逻辑绑定用户界面线程。一个更有效的解决方案是创建一个新线程并在那里运行计算。创建计算类,订阅执行代码中的已完成事件并启动线程。通过这种方式,您可以在执行过程中的任何时候设置标签,因为您的业务逻辑在用户界面的单独线程上运行。

使用标签绑定字符串变量。用标签2向装订。当用户单击按钮时更新文本。它可能会引用标签,因为绑定是双向的。谢谢您的评论。我要试试看。如果有用的话,我会汇报的。如果任何帖子的答案对你有帮助,一定要标记答案。谢谢你的想法。我将对此进行研究,我可以在脑海中看到它是如何工作的,只是以前从未编写过类似的代码。不要告诉我怎么做-我想挑战自己去弄清楚这个部分。很好,因为我已经有一段时间没有做过类似的事情了!让我知道,我总是可以做一些研究,并尝试提供一个例子。我认为最棘手的事情是在一个单独的线程上订阅一个事件。+1线程化进程的优点是不会冻结您的界面。在您完成挑战自己之前,不要单击以下链接;)您好,谢谢,这将是理想的工作,但有一个问题。。。我正在编写我没有编写的遗留代码,并且它没有使用MVC。
 <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Button Grid.Row="0" Command="{Binding CalculationCommand}" Content=" Calculate" />
        <Label Grid.Row="1" Content="{Binding StateText}" />
    </Grid>
public class ViewModel : INotifyPropertyChanged
{
    private string _stateText;

    public RelayCommand CalculationCommand { get; set; }

    public string StateText
    {
        get { return _stateText; }
        set { _stateText = value;  OnPropertyChanged("StateText");}
    }

    public ViewModel()
    {
        CalculationCommand = new RelayCommand(OnCalculate);
        StateText = string.Empty;
    }

    private void OnCalculate(object obj)
    {
        StateText = "Please wait, calculating.";

        var context = TaskScheduler.Current;

        Task.Factory.StartNew(() =>{
                                        //Calculating Logic goes here   
                                   }).ContinueWith(x =>
                                                       {
                                                           StateText = "Done.";
                                                       },context);


    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}