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