2016-07-13 3 views
2

Я разрабатываю приложение с кратными окнами, которое совместимо с несколькими экранами. Я сделал свой собственный заголовок для всех окон.Управление Максимизация функций для двойного экрана

Мой заголовка:

<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. Мне нужно было увеличить вдвое за экраном, чтобы иметь правильный размер.

Вы можете мне помочь?

+1

И если панель задач находится слева или справа или также отображается на вторичных мониторах? – Phil1970

+1

В этом случае он не работает :-(Этот код очень простой и учитывает только один случай. Но прискорбно, что .NET не предоставляет функции для управления активной областью и экраном (или я ее не нашел) –

ответ

0

я, наконец, нашел решение, но, возможно, не самый лучший:

private void Maximize() 
{ 
    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; 
} 

protected override void OnStateChanged(EventArgs e) 
{ 
    if (WindowState == WindowState.Maximized && DoRefresh) 
    { 
     DoRefresh = false; 
     WindowState = WindowState.Normal; 
     Maximize(); 
     DoRefresh = true; 
    } 
} 

Проблема в том, что изменение высоты или MaxHeight на развернутом Windows, не имеет никакого эффекта. Когда статус изменится на Максимизированный, я заставляю его нормально и меняю MaxHeight. После этого я сброшу статус на максимальный. Я создал bool DoRefresh, чтобы избежать бесконечных циклов.