質問

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

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

役に立ちましたか?

解決

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

他のヒント

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top