0

ツールチップ付きのボタンがいくつかあるアプリケーションがあります。これらのボタンの 1 つ (以降、実行ボタンと呼びます) を押すと、アプリケーションの外部でプロセスの起動が開始されます。私のアプリケーションはこれらのプロセスから取得した出力からデータを取得する必要があるため、すべてのプロセスの実行が完了するまでアプリケーションを一時停止し、ユーザーの介入なしにデータを取得します。もちろん、これは外部プロセスの実行中にアプリケーションがハングすることを意味しますが、ユーザーはクリックしてアプリケーションの外部で他の作業を行うことができるため、大したことではありません。私のアプリケーションはバックグラウンドに落ちます。残念ながら、[実行] ボタンに関連付けられたツールヒントはバックグラウンドに移動せず、コードの実行が停止するまで消えません。

次のコードが少し役に立ちました。

private void RunButton_Click(object sender, RoutedEventArgs e)
{
    /*Gets the tooltip out of the way while running, otherwise it will stay in front of   everything until the optimizers finish.*/
    ToolTipService.SetShowDuration(runButton, 0);
    RunTooltip.IsOpen = false;//Doesn't close fast enough. It fades a little then hangs there until the code stop running. googling has been remarkably unhelpful.
    Run();
    ToolTipService.SetShowDuration(runButton, 5000);
}

RunTooltip は、問題の ToolTip の名前です。期間を 0 に設定するか、isOpen を false に設定すると、同じ動作になります。Run() が終了するまで、ツールチップが半透明になります (ただし、他のすべてのウィンドウの上に表示されます)。

Windows.Forms.Tooltips ( http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.usefading.aspxを参照) を使用してツールチップのフェードを即座に行う方法があったようですが、 WPF ツールチップ (http://msdn.microsoft.com/en-us/library/ms617634.aspx) には当てはまらないようです。

このボタンのツールチップを完全に削除する以外に、このツールチップがアプリケーションの終了を待っている間にユーザーがやりたいことの邪魔にならないようにするにはどうすればよいですか? ありがとう

4

3 に答える 3

1

BackgroundWorker を使用して、CallBack に UI をロードできます。

BackgroundWorker クラス

進行状況リンク プロセス X/Y を報告する場合は、ReportsProgress を使用できます。そしてキャンセルできます。

于 2012-09-26T22:56:35.600 に答える
0

OnClickedイベントでToolTipのポップアップコンポーネントの表示を変更できる可能性がありますが、VisualTreeHelperを使用してToolTipを見つける必要があり、すべて少し面倒です。UIは引き続きフリーズするため、これを行うのに最適な方法ではありません。

経験則は次のとおりです。UIをフリーズしている場合は、間違っています。

おそらく、ビジーインジケーターでコントロールをラップする必要があります(コードプレックスのWPFツールキットには優れたインジケーターがあります)。WPFは、MVVMパターンを使用すると最適に(つまり、最もクリーンに)機能しますが、コードビハインドで直接作業している場合は、次のようになります。

void MyButton_Click(object sender, EventArgs e)
{
    var backgroundThread = new Thread(DoWork);
    this.MyBusyIndicator.IsBusy = true;
    backgroundThread.Start();
}

そして、作業が完了したら、BusyIndi​​catorをBusyでなくなるように設定します。

于 2012-09-26T23:33:41.493 に答える
0

誤解している可能性があるため、間違っている場合は修正してください。ただし、UIを処理しているスレッドで、計算コストの高い処理を行っているようです。この問題に対するより簡単な解決策は、次のようなワーカー スレッドを作成することです。

    private void button1_Click(object sender, EventArgs e)
    {
        Thread workerThread = new Thread(ExpensiveMethod);
        btnShow.Visible = false;
        workerThread.Start();
    }

    private void ExpensiveMethod()
    {
        for (int i = 0; i < int.MaxValue; i++)
        {

        }

        btnShow.Visible = true;
    }

これは、計算コストの高いものがワーカー スレッドによって処理されている間、UI (およびツールチップ) を処理するスレッドが通常どおり処理できることを意味します。

誤解していたら教えてください!

于 2012-09-26T22:59:32.823 に答える