Как сделать окно WPF развернутым на экране с помощью курсора мыши? - PullRequest
43 голосов
/ 26 июня 2010

В соответствии с документацией MSDN для свойства WindowStartupLocation :

Настройка CenterScreen приводит к тому, что окно располагается в центре экрана, содержащего курсор мыши.

Хотя документ MSDN для CenterScreen Field сам определяет его несколько менее четко как:

Местоположение запуска окна - центр экранана котором он открыт.

Простой тест показывает, как это работает:

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 ]

81 голосов
/ 19 января 2014

Вы можете установить его в XAML

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

Вам необходимо установить SizeToContent на Ручной . Подробности см. В других ответах.

41 голосов
/ 30 июня 2010

Я задал тот же вопрос на MSDN WPF Forum и получил ответ с этим замечательным решением :

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();
}

Я также отправил сообщение об ошибке об этой проблеме в Microsoft, которую они в настоящее время рассматривают.

5 голосов
/ 24 июля 2012

Убедитесь, что для SizeToContent установлено значение SizeToContent.Manual, иначе оно не будет работать.

2 голосов
/ 27 августа 2016

Начать с максимизации окна можно, добавив следующее к разметке XAML.

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

Свойство WindowState подчинено SizeToContent , что означает, что вам необходимо установить последнее Вручную (если вы хотите фактическую максимизацию). Вы также можете установить SizeToContent на Высота или Ширина (если вы хотите максимизировать окно в одном измерении, при этом соблюдая размер, рассчитанный на основе размеров элементов управления в другом).

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

Приведенное выше окно будет охватывать окна сверху вниз, но не обязательно слева направо. Это эквивалентно нажатию комбинации клавиш Win + Shift + Up .

...