Я разрабатываю приложение с кратными окнами, которое совместимо с несколькими экранами. Я сделал свой собственный заголовок для всех окон.Управление Максимизация функций для двойного экрана
Мой заголовка:
<Grid x:Class="TitleBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Style="{DynamicResource TitleStyle}"
MouseLeftButtonDown="gridBar_MouseLeftButtonDown"
x:Name="titleBar">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" [...]/>
<Button Grid.Column="1" x:Name="bttnClose" [...]/>
<Button Grid.Column="1" x:Name="buttonMinimize" [...]/>
</Grid>
С помощью функции:
private void gridBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (Window.GetWindow(this) != null)
{
if (e.ClickCount == 2) // double click handle
{
if (Window.GetWindow(this).WindowState == WindowState.Normal)
Window.GetWindow(this).WindowState = WindowState.Maximized;
else
Window.GetWindow(this).WindowState = WindowState.Normal;
}
try
{
Window.GetWindow(this).DragMove();
}
catch { }
}
}
Все мои окна не повторно значительные (макс/мин Высота и ширина равны), за исключением основных окон. Поэтому я хочу управлять экраном в многоэкранном режиме.
Я добавил это в моем MainWindow
Класс:
protected override void OnStateChanged(EventArgs e)
{
if (WindowState == WindowState.Maximized)
{
var hwnd = new System.Windows.Interop.WindowInteropHelper(this).EnsureHandle();
var currentMonitor = NativeMethods.MonitorFromWindow(hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST);
var primaryMonitor = NativeMethods.MonitorFromWindow(IntPtr.Zero, NativeMethods.MONITOR_DEFAULTTOPRIMERTY);
var isInPrimary = currentMonitor == primaryMonitor;
// Don't want to hide the taskbar
if (isInPrimary)
this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
else
this.MaxHeight = Double.PositiveInfinity;
}
base.OnStateChanged(e);
}
internal static class NativeMethods
{
public const Int32 MONITOR_DEFAULTTOPRIMERTY = 0x00000001;
public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr MonitorFromWindow(IntPtr handle, Int32 flags);
}
Он работает почти, но когда я поставил MaxHeight
, он не обновляет фактическую Height
. Мне нужно было увеличить вдвое за экраном, чтобы иметь правильный размер.
Вы можете мне помочь?
И если панель задач находится слева или справа или также отображается на вторичных мониторах? – Phil1970
В этом случае он не работает :-(Этот код очень простой и учитывает только один случай. Но прискорбно, что .NET не предоставляет функции для управления активной областью и экраном (или я ее не нашел) –