1

わかりましたので、コンテキスト固有の情報を表示するユーザーの要求で(プログラムの通常の操作中に)ポップアップするウィンドウがあります。このウィンドウにはたまたま多くの要素が含まれているため、読み込みに 0.5 ~ 1 秒かかります。ただし、このウィンドウにはコンテキストに応じていくつかの異なる種類の情報が含まれると予想されるため、コンテンツの幅と高さが異なる場合があります。したがって、SizeToContent 値を「WidthAndHeight」に設定して、ウィンドウにバインドされているコンテンツに基づいてウィンドウのサイズを変更できるようにします。

ただし、ウィンドウの読み込みには時間がかかるため、ユーザーには最初に小さな正方形のウィンドウが表示され、すべてがレンダリングされた後にフルサイズのウィンドウが表示されます。完全に読み込まれる前に、ユーザーに小さなウィンドウが表示されないようにしたいと思います。

ウィンドウが完全にレンダリングされた後にのみ表示されるようにする方法はありますか?

私が試したこと:

  • ウィンドウの可視性を「非表示」に設定してから、ContentRendered イベント ハンドラで「可視」に設定します。ウィンドウは表示されません。

  • ウィンドウの不透明度を 0 に設定してから、ContentRendered イベント ハンドラーで 1 に設定します。ウィンドウ自体のコンテンツの不透明度は 0 に設定され、次に 1 に設定されます。

更新:別の試み

また、XAML で Window.WindowState を「Minimized」に設定してから、ContentRendered イベント ハンドラで「Normal」に設定しようとしました。ウィンドウ自体の幅は本来よりも大きいですが、これは部分的に機能しているようです。さらに悪いことに、ウィンドウのコンテンツがウィンドウの正しいサイズに従ってレンダリングされ、コンテンツを再レンダリングせずにウィンドウが大きくなったように見えます。したがって、コンテンツはウィンドウの中央に配置されず、ウィンドウの正しいサイズと現在の (大きい) サイズの違いを表す厄介な黒い四角形がコンテンツの右側に表示されます。ウィンドウの端をつかんで手動でウィンドウのサイズを変更すると、コンテンツが適切に再レンダリングされ、すべてが正常に表示されます。しかし、コードでそのような再レンダリングを強制するにはどうすればよいでしょうか? Window.UpdateLayout() は機能しません。

4

3 に答える 3

1

わかりました、うまくいく解決策を見つけました。理想的ではありませんが、機能します。

まず、XAML で Window.WindowState を "Minimized" に設定します。これにより、レンダリング中にウィンドウが画面に表示されなくなります。次に、ウィンドウの ContentRendered イベントをサブスクライブし、ハンドラーに次のコードを追加しました。

this.WindowState = System.Windows.WindowState.Normal;
this.MaxWidth = MainContentPresenter.ActualWidth;
this.Height = MainContentPresenter.ActualHeight;

this.InvalidateVisual();

MainContentPresenter はウィンドウの ContentPresenter です。ViewModel はこの要素にバインドされているため、コンテンツはそこに表示されます。

于 2011-03-14T20:43:22.460 に答える
0

わかりました、私は間違いを見つけました。WidthAndHeight に設定された SizeToContent は、ウィンドウを表示する前に新しいウィンドウの DataContext が設定されている限り、正常に機能します。次のように:

secondaryWindow.DataContext = viewModel;  

secondaryWindow.Show();

それよりも:

secondaryWindow.Show();

secondaryWindow.DataContext = viewModel;  

私が持っていたように。

そのため、DataContext が null の場合はウィンドウのサイズが適切に変更され、DataContext が設定されたときにウィンドウのサイズが変更されました。

このバグを間接的に発見する原因となったソリューションを追加してくれた Elad Katz に感謝します。

于 2011-03-16T17:49:34.467 に答える
0

イベントをまったく表示しなくても、ウィンドウに必要なイベントのサイズを知ることができることに注意してください。

必要なサイズを知りたいコントロールがある場合は、次のことができます

// I'm picking Button here, but any control could be put here, be it
// Window or whatever:

Button b = new Button();

// I'm putting some content to see that it actually measures it children. If you'll put more text here
// you'll see bigger size
b.Content = "Hello";

// I'm manually measuring the control, passing in double.PositiveInfinity so that the control
// would give me the size it wants, regardless of any constraints (you can put constraints here
// if you like)
b.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

// After Measure is called, the Property DesiredSize become relevant, and contains the size that the
// Control needs to show all of its contents.
MessageBox.Show(b.DesiredSize.ToString());
于 2011-03-14T23:06:47.620 に答える