51

WindowStartupLocation プロパティの MSDN ドキュメントによると:

CenterScreen を設定すると、マウス カーソルを含む画面の中央にウィンドウが配置されます。

CenterScreen フィールド自体の MSDN doc では、次のようにやや明確に定義されていませんが。

ウィンドウの起動位置は、ウィンドウを開いた画面の中央です。

簡単なテストでは、これが正常に機能していることを示しています。

MainWindow.xaml

<Window x:Class="CenterScreenTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Button Click="button_Click">Open Window</Button>
</Window>

MainWindow.xaml.cs

using System.Windows;

namespace CenterScreenTest
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            Window window = new Window();
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.Show();
        }
    }
}

デュアル モニタ システムでこれをテストすると、ボタンをクリックしたときにマウス カーソルがある画面の中央に新しいウィンドウが表示されることがわかります。それはまさにそれがどのように機能するかです

ただし、ウィンドウを表示する前に最大化するように設定しようとすると、アプリケーションを起動したディスプレイでのみ新しいウィンドウが最大化されます。button_Click イベント ハンドラーを次のように変更して、意味を確認します。

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.WindowState = WindowState.Maximized;
    window.Show();
}

これで、ウィンドウは、ボタンをクリックしたときにマウス カーソルがどこにあるかに関係なく、アプリケーションが起動された画面でのみ最大化されます。表示後にウィンドウの状態を最大化に設定すると、CenterScreen は正しく機能します。これは、ユーザーがウィンドウを最大化するのと同じです。例えば:

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.Show();
    window.WindowState = WindowState.Maximized;
}

もちろん、ここでの問題は、ウィンドウを表示した後にウィンドウを最大化するのにはるかに時間がかかり、私のようなアプリでは、ウィンドウをすぐに配置する必要があることです.

解決策を知っている人はいますか?

4

4 に答える 4

45

MSDN WPF フォーラムで同じ質問をしたところ、次の素晴らしい回避策で回答が得られました。

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.SourceInitialized += (s, a) => window.WindowState = WindowState.Maximized;
    window.Show();
}

また、この問題に関するバグ レポートをマイクロソフトに提出し、現在調査中です。

于 2010-06-30T17:51:01.750 に答える
8

ウィンドウの最大化から開始するには、XAML マークアップに次のように追加します。

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Manual">
</Window>

プロパティWindowStateSizeToContentの下位にあります。つまり、後者のManualを設定する必要があります(実際の最大化が必要な場合)。また、 SizeToContentHeightまたはWidthに設定することもできます (ウィンドウを 1 つの次元で最大化し、もう 1 つの次元でコントロールのサイズに基づいて計算されたサイズに従う場合)。

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Width">
</Window>

上記は、ウィンドウを上から下に広げますが、必ずしも左端から右端までではありません。キーの組み合わせWin+ Shift+を押すのと同じUpです。

于 2016-08-27T09:34:47.800 に答える
5

SizeToContent が SizeToContent.Manual に設定されていることを確認してください。そうしないと機能しません。

于 2012-07-24T08:05:44.623 に答える