SizeToContent
をWidthAndHeight
に設定すると、WindowStartupLocation="CenterOwner"
が正しく動作しません。新しいウィンドウの中心が親のオーナーの中心になるのではなく、子ウィンドウの左上の角のように親の中心にくるように見えます。 SizeToContent
を削除しても問題ありません。 どうしたのですか?wpfセンターの子ウィンドウがsizetocontentで動作しない
答えて
ウィンドウを、私はあなたが忘れすることができることを考えることができ
唯一のものは、実際にその所有者である子ウィンドウを伝えることですそれが測定されると、WindowStartupLocation
は、測定プロセスによって計算されたウィンドウのActualWidth
およびActualHeight
を使用して処理されます。
ActualWidth
とActualHeight
は、Show()またはShowDialog()呼び出し時にゼロまたは比較的小さく測定され、後ではゼロ以外の値に設定されることがわかります。
たとえば、ウィンドウのコンテンツがLoaded
イベントでのみ設定されたDataContextを使用して構築されている場合に発生します。 Show()
が呼び出されると、ウィンドウはまだLoaded
になっていないので、データはありません。後でLoaded
イベントが発生すると、DataContextが設定され、ウィンドウのコンテンツは更新されますが、位置付けは既に発生しています。
Dispatcher.BeginInvoke呼び出しを使用してコンテンツを埋め込んだり、別のスレッドからコンテンツを埋め込んだり、遅延または非同期のバインディングを使用したりするなど、さまざまなシナリオがあります。
基本的には、Show()
が呼び出された瞬間にウィンドウの内容が通常より小さくなる可能性のあるものを探して修正する必要があります。
あなたの質問は少し曖昧です。 SizeToContentとWindowStartupLocationをどちらのウィンドウ(「親」または「子」)で設定していますか?
私のプロジェクトで2番目のウィンドウを作成し、そのSizeToContentとWindowStartupLocationを記述した方法で設定すると、目的の結果が得られます。あるいは、より簡潔に
Window2 w = new Window2();
w.Owner = this; // "this" being the parent window
w.ShowDialog();
:
new Window2 { Owner = this }.ShowDialog();
さて、レイはこれをすばらしく見せてくれました。簡単に言えば、彼が何を言いたいことは、ウィンドウの位置決めが行われた後、あなたはHeight
& Width
(ともActualHeight
& ActualWidth
)をリセットごLoaded
イベントであなたのコントロールの内容を設定していること、です。この問題を解決するには
、次の2つの選択肢があります:
-
は
- と
Loaded
イベントの最後にこのメソッドを呼び出します。
Owner
に応じて、あなたの
Window
の位置を再計算するための簡単な方法を追加し、コンストラクタにあなたのコンテンツ値の設定コードを移動し、または、
...
private void CenterOwner()
{
if (Owner != null)
{
double top = Owner.Top + ((Owner.Height - this.ActualHeight)/2);
double left = Owner.Left + ((Owner.Width - this.ActualWidth)/2);
this.Top = top < 0 ? 0 : top;
this.Left = left < 0 ? 0 : left;
}
}
バインドされた動的コンテンツは、ほとんどがGUI直接描画されることがありますが、GUIディスパッチされることがあります。タイマーおよび他のスレッドは、(MVVM)プロパティ変更イベントを開始できます。 WPF Dispacherキューの優先順位を設定するため、近い時間にレンダリングが行われますが、ガーベージ処理は行われません。 レンダリングが終了したら、WPFは処理の順序について何も言えません。つまり、WPFはStartPositionを計算する理想的な時間にはなりません。
WPF-queueがemtpyであることを待つのは難しいことです。 WPFはあなたのコードを処理する時間があることを確信しています。つまり、WindowのShowDialog呼び出しを遅らせることになります。
MVVMやその他のダイナミックスの変更に対して動的コンテンツの変更を実行するには、常にGUIメインスレッドにが必要です。 マルチディスプレイをサポートするために、位置を手動で計算しないでください。非常に複雑です。 WPFがすべての操作を完了したときに、このコードを試してウィンドウを開くと、ウィンドウのみが開きます。
win.Dispatcher.Invoke(new Action(() => win.ShowDialog()), DispatcherPriority.ApplicationIdle);
- 1. WindowStyle = "None"のときにWPF SizeToContentが機能しない
- 2. テキストアライメント:センターとアライメントアイテム:センターが水平に動作しない
- 3. WPF共通ウィンドウの動作
- 4. WPF observablecollection。子ウィンドウ
- 5. WPFのフローティング子ウィンドウ
- 6. propelがウィンドウで動作しない
- 7. ブートストラップモードがサファリ/ウィンドウで動作しない
- 8. Process.startがウィンドウで動作しない
- 9. mysql_real_escape_stringがウィンドウで動作しない
- 10. OnMainWindowCloseがwpfで動作しない
- 11. DataTriggerがWPF ListBoxで動作しない
- 12. テキストアラインメント:ソーシャル部門でセンターが動作しない
- 13. Xamarin Android:センターがテキストビューで動作しない
- 14. ウィンドウのUserControlが機能しないWPF
- 15. ウィンドウOnkeypressが動作しない
- 16. droolsウィンドウが動作しない
- 17. text-align:センターが動作しないときはposition:absolute with javascript?
- 18. WPFでの自動テンプレート選択がインターフェイスで動作しない
- 19. WPFバインドとDataviewが動作しない
- 20. WPF AlternateContentが動作しない
- 21. WPfパス回転が動作しない
- 22. WPF ToggleButtonバインディングが動作しない
- 23. WPF Toolkit Combobox DisplayMemberPathが動作しない
- 24. WPF app.xaml exitイベントが動作しない
- 25. WPFバインディングが動作しない
- 26. WPF ComboBox ItemsSourceバインディングが動作しない
- 27. センターOutlook WPFアドイン
- 28. WordのWPFウィンドウが1回だけ動作します
- 29. 起動時ウィンドウのオプションがWindowsで動作しない
- 30. 子コンポーネントでVuexが動作しない
ありがとう、私は実際Show()の直後にコンテンツをロードしていました。愚かな間違いは、今うまく動作:) – immuner