Eric Bielmann Ответов: 2

разверните окно с помощью ResizeMode="NoResize" wpf


У меня есть окно со следующими свойствами:

ShowInTaskbar="False" WindowStyle="None" ResizeMode="NoResize" Topmost="True" AllowsTransparency="True" Background="Transparent"


и я хочу развернуть окно После нажатия кнопки со следующей строкой:

this.WindowState = System.Windows.WindowState.Maximized;


при этом окно позиционируется мной в левом верхнем углу, но оно не развернуто.

также тестировался со следующими строками но не работал:

this.Height = SystemParameters.MaximizedPrimaryScreenHeight;
this.Width = SystemParameters.MaximizedPrimaryScreenWidth;
this.Top = 0; this.Left = 0;


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

Большое спасибо.

2 Ответов

Рейтинг:
1

Tomaž Štih

-лучше поздно, чем никогда.-

Из вашего фрагмента кода я предполагаю, что вы создали свое собственное пользовательское окно. Прежде всего: если вы используете AllowsTransparency, ваше окно не сможет отображать какие-либо элементы управления старого стиля (например, веб-браузер). К сожалению, без этого окно не будет привязываться к экрану.

Отложив это в сторону, то, что я сделал, чтобы правильно максимизировать, - это

1. Добавить максимизировать/восстановить поведения на МАКС/кнопку Восстановить окно. Это поведение просто запускает команду maximize/restore.

2. В моем XAML-код всю логику окно находится внутри границы. Подобный этому...

<Border x:Name="PART_WindowBorder">
<!-- window def. here -->
</Border>
3. Моя команда максимизации/восстановления выглядит следующим образом.
public void Execute(object parameter)
{
    var window = parameter as Window;

    if (window != null)
    {
        // Get border part.
        Border border = window.Template.FindName("PART_WindowBorder", window) as Border;

        // Fix border margin with maximizing (WPF bug)...
        if (window.WindowState == WindowState.Maximized)
        {
            border.Margin = new Thickness(0);
            window.WindowState = WindowState.Normal;
        } 
        else
        {
            border.Margin = new Thickness(6);
            window.WindowState = WindowState.Maximized;
        }
    }
}
Поэтому вы просто увеличиваете маржу до 6 при максимальном увеличении (смещение равно 7, Моя граница равна 1). Здесь вы также можете проверить правильность версии окна и прочитать маржу с помощью GetSystemMetrics.

С уважением,
Томаз


Рейтинг:
0

Sergey Alexandrovich Kryukov

Выглядеть странным. Это так, я бы временно изменил режим изменения размера и их максимизировал. Возможно, Вам также придется справиться с этим событием StateChanged или переопределить виртуальный защищенный метод StateChanged, чтобы убедиться, что у вас есть то же самое ResizeMode когда вы меняете WindowState опять же, либо путем присвоения ему нового значения, вызывая, например RestoreBounds или пользователем пользовательского интерфейса. Пожалуйста смотрите:
http://msdn.microsoft.com/en-us/library/system.windows.window.statechanged%28v=vs.100%29.aspx[^],
http://msdn.microsoft.com/en-us/library/system.windows.window.onstatechanged%28v=vs.100%29.aspx[^];
смотреть также:
http://msdn.microsoft.com/en-us/library/system.windows.window.resizemode%28v=vs.100%29.aspx[^],
http://msdn.microsoft.com/en-us/library/system.windows.window.windowstate%28v=vs.100%29.aspx[^],
http://msdn.microsoft.com/en-us/library/system.windows.window.restorebounds%28v=vs.100%29.aspx[^].

Удачи,

—СА