Подтвердить что ты не робот

Как я могу сделать окно WPF максимально на экране с помощью курсора мыши?

В соответствии с документацией 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;
}

Проблема здесь, конечно, в том, что максимизация окна после показа его занимает гораздо больше времени, и в приложении, таком как мое, окно должно появляться сразу.

Кто-нибудь знает о решении?

4b9b3361

Ответ 1

Я задал тот же вопрос на форуме 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();
}

Я также представил отчет об ошибках об этой проблеме в Microsoft, которые они сейчас просматривают.

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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