0

XAML ベースのアプリでは、画面上の要素を操作したり、サイズを変更したり、要素を移動したりする必要があることがよくあります。この状況は通常、非常にカスタムの UI コントロールで発生します。

スタッフのロードやデータバインディングなどのタイミングは、イライラするタイミングの問題を引き起こす可能性があります。

従来、私の同僚と私は、従属プロパティが「最終」状態にあるときに後で実行されるように、作業を UI スレッドに「再ディスパッチ」することでこれらの問題を回避してきました。

これを行うより良い方法はありますか?どのような戦略がうまくいきましたか?

LayoutUpdated イベントは非常にノイズが多く、きめが細かい可能性があり、登録解除にはメソッドの Lambda を放棄する必要があるため、外部ロジックから囲まれた変数にアクセスできません。

編集

具体的な例を挙げます。カスタム コントロールは、顔認識を行うときに顔の周りにアウトラインを描画するため、ここでは完全にカスタムのことを話しているので、XAML はそのままでは何もしません。

画像を拡大縮小してサイズを調整し、パスとジオメトリを拡大縮小してサイズを調整して、すべてが整列するようにする必要があります。

要素の高さと幅をプログラムで変更した場合、その影響はすぐには反映されません。UI スレッドが XAML フレームワークに解放されたときにのみ、レンダリング サブシステムがすべてを再配置します。

したがって、変更された値に依存するロジックは、フレームワークがすべてを再配置した後に実行する必要があるため、この作業は UI スレッドで後で実行するようにスケジューリングする必要があるため、ディスパッチに頼ります。臭い。

多くのイベントとバーチャルは、必要なデータがまだ利用できないときに呼び出されます。場合によっては、データの到着時に作業を行う必要があります (つまり、プロパティの変更通知)。これは通常、XAML レイアウト イベントをトリガーしません。この場合、ディスパッチャ ハックに頼ります。

4

2 に答える 2

0

WPF では、この依存関係プロパティのメタデータ引数が、私が話している問題を解決するために存在することを発見しました。

FrameworkPropertyMetadataOptions.AffectsRender

列挙型は Windows ストア アプリケーションには存在しません。これはおそらく、その設計者がInvalidateArrangeメソッドが適切な代替手段であると考えているためです。

おそらく、a) DP 変更ハンドラー内の配置を無効にする、b) 複数のパスにわたってこれらの配置を作成する、c) パス間の不適切なレイアウトを許容する必要があります。

それでも、ディスパッチャーでラムダを使用すると、計算で使用される変数をクロージャー内から参照できるので便利です。

于 2013-10-09T09:15:30.653 に答える
0

Loadedイベントの使用について:

Loaded += LoadedHandler;

...

private void LoadedHandler(object sender, RoutedEventArgs e)
{
    // Do something here when controls have loaded
}
于 2013-10-08T12:42:00.337 に答える