1

だから私はActualWidthそれが完全にロードされるまで0に等しいかもしれないことを読みました。そのようにイベントハンドラーを追加して、完全にロードされていることを確認します。

text.AddHandler(TextBlock.LoadedEvent, new RoutedEventHandler(textBlock_Loaded));

textBlock_Loadedイベントでは、私は持っています:

TextBlock tb = sender as TextBlock;
textBlockWidth = tb.ActualWidth;

mainメソッドで変数を使用する必要がありますtextBlockWidthが、mainメソッドで出力するtextBlockWidthの値を書き込むたびに、0が返されます。

したがって、この質問はActualWidth、アクションを実行する前に、それが0でないことを確認するにはどうすればよいですか?WPFはイベント駆動型であるため、実行前ではなく、実行時に何らかのメソッドをトリガーする方法はありますか?それ以外の場合は、0を返します。

4

2 に答える 2

5

なぜ実際の幅を保存するのですか?コントロールへの参照を保存して、本当に必要なときに実際の幅を取得してみませんか?

ロードされたイベントを使用するだけで十分なはずなので、コードが失敗する理由がわかりません。Object Lifetime EventsのMSDNページによると:

Loadedイベントは、最終レンダリングの前に発生しますが、レイアウトシステムがレンダリングに必要なすべての値を計算した後に発生します。

したがって、すべてのコントロールで最終的な位置とサイズの値を設定する必要があります。また:

Loadedイベントは、要素ツリー全体(具体的には論理ツリー)全体で調整された作業として発生します。ツリー内のすべての要素がロードされたと見なされる状態になると、最初にLoadedイベントがルート要素で発生します。次に、Loadedイベントが各子要素で連続して発生します。

于 2010-08-22T21:38:45.500 に答える
3

を取得することはできませんActualWidth。なので、ロード時に更新されません。したがって、またはを取得するには、またはTextBlockその親のディスパッチャを使用する必要があります。ActualWidthActualHeight

this.textBlock.Dispatcher.BeginInvoke((Action)(() =>
            {
                textBlock = this.textBlock.ActualWidth;
            }));
于 2010-08-23T07:28:56.580 に答える