2

ボタンがクリックされたときにかなり複雑な計算を行うアプリケーションがあります。私はまだこのコードをより効率的にしようとしていますが、それまでの間、UI のラベルを更新して、ボタンがクリックされ、計算が進行中であることを示すユーザー フィードバックを提供したいと考えています。

クリック イベントが完了するまで UI は更新されないため、クリック イベントのコードがトリガーされる直前に呼び出されるイベントにコードを配置する必要があります。

これまでのところPreviewMouseLeftButtonDown、クリックイベントが実行される前に呼び出されるイベントを使用してラベルを更新しています。これはマウスクリックで機能します。
ただし、ボタンにフォーカスがあるときにユーザーが Enter キーを押すと、PreviewKeyDownANDKeyDownイベントがトリガーされないか、少なくとも Click イベントがトリガーされる前にトリガーされないように見えます。

Enterキーが押されたときにラベルを更新するために使用できるイベントは何ですか?または、クリックイベントのコードが実行される前にラベルを更新する別の方法を知っていますか?

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)
        {

        }
    }
4

3 に答える 3

1

私はあなたのジレンマを理解しています。ユーザー インターフェイス スレッドをビジネス ロジックと結び付けているように聞こえます。より効果的な解決策は、新しいスレッドを作成し、そこで計算を実行することです。計算クラスを作成し、実行中のコードで完了イベントをサブスクライブして、スレッドを開始します。このようにして、ビジネス ロジックがユーザー インターフェイスとは別のスレッドで動作するため、実行中の任意の時点でラベルを設定できます。

于 2012-11-02T13:31:45.623 に答える
0

を使用.Refresh()して、編集後にラベルを強制的に更新することができます。そうすれば、別のイベントに結び付けることを心配する必要はありません。必要なものを変更し、 を呼び出し.Refresh()て、主要な処理を開始するだけです。

于 2012-11-02T13:28:12.860 に答える
0

イベントの代わりにボタンの Command プロパティを使用しないのはなぜですか?

コマンドは、マウス クリックまたはエンター キーによってトリガーされます。

指揮の概要

コマンドバインディング

Xaml:

 <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));
    }
}

Josh Smith の記事の RelayCommand を使用しています

于 2012-11-02T13:25:08.403 に答える