3

ValueChanged イベントをトリガーせずに、コード内のコントロール (Slider.Value) に依存関係プロパティを設定する必要があります (ユーザーではなく値を設定するため)。WPF でこの状況を処理する最善の方法は何ですか?

明確にするために、私がやろうとしているのは、WPF スライダーを WinForms ユーザー コントロールに接続することです。現在、私のアプリには、メソッド呼び出しを介してスライダーの値を WinForms コントロールに渡す ValueChanged イベント ハンドラーがあります。WinForms コントロール (実際にはネイティブ OpenGL ウィンドウのラッパー) は、内部計算に基づいてスライダーを動的に変更できる必要があります。これを行うには、スライダー (ISlider) の抽象化を使用し、アプリでそのスライダーの WPF フレーバーをインスタンス化し、そのベースへのハンドルを WinForms ユーザー コントロールの .NET プロパティを介して WinForms コントロールに渡します。これはすべて現在機能しています。内部ロジックがスライダーを変更する必要があると判断すると、ISlider::SetPos() が呼び出され、WPF スライダーが変更され、スライダーで ValueChanged イベントがトリガーされます。そのイベントのハンドラーは、スライダーの位置を抽出し、最初にイベントを発生させた WinForms コントロールに渡します。ligaz と Alan Le による提案はどちらも機能するように見えますが、これについて最善の方法で行っているかどうかはわかりません。

4

3 に答える 3

5

これは単純な回避策/ハックです。設定を変更したかどうかを追跡するブール値を追加します。たとえば、「IsChangedByMe」とします。コードで依存関係プロパティを変更する場合は、bool を true に設定します。ValueChanged イベントでは、IsChangedByMe が true の場合、何もしません。

于 2008-09-30T23:33:59.563 に答える
5

あなたは本当にそれをしたいですか?そのプロパティにデータバインドされた UI の一部があり、ValueChanged イベントをトリガーせずに値を変更できる場合、すぐに UI がデータと同期されなくなります。

スライダーの場合、ユーザーが 75% に配置したとします。これで、コードはバックグラウンドでそれを 10% に変更しますが、変更通知を抑制します。画面上ではまだ 75% のように見えますが (変更されたことが通知されていないため)、実行中のコードでは 10% として使用されています。混乱のレシピのように聞こえます。

于 2008-10-01T06:49:35.837 に答える
1

考えられる解決策の1つは、Sliderから派生し、OnValueChanged(...)をオーバーライドすることです。イベントを発生させたくない場合は、何もしないでください。それ以外の場合は、基本実装を呼び出す必要があります。

于 2008-09-30T21:51:56.393 に答える