2014-12-29 5 views
2

Если я создаю пустое приложение WPF из шаблона Visual Studio и устанавливаю размеры окна в разрешение моего устройства, когда я максимизирую окно, я вижу черную полосу на прямо там, где появляется полоса прокрутки, будет отображаться (но это не так и не должно быть). Также см. То же самое внизу. Обратите внимание, что строка заголовка - это правильная максимизированная ширина, поэтому я предполагаю, что это все проблемы рендеринга клиентской области.WPF Window резервирует пространство для полосы прокрутки в области клиента при максимальном

Я удалил элемент управления сеткой по умолчанию, который поставляется вместе с шаблоном, поэтому XAML здесь голые кости. В этом случае я нацелен на дисплей с разрешением 1366x768. Увеличьте это окно на дисплее, установленном на 1366x768, чтобы увидеть проблему (или измените значение vals на разрешение дисплея).

Вот код MainWindow.xaml. MainWindow.xaml.cs - это нетронутый код шаблона по умолчанию.

<Window x:Class="TestMaximize.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Width="1366" 
     Height="768" 
     MaxWidth="1366" 
     MaxHeight="768" > 
</Window> 

Что вызывает эти области фантомных полос прокрутки и как это предотвратить?

Спасибо за любые мысли об этом.

ответ

1

Причина в том, что вы устанавливаете MaxWidth, чтобы быть слишком маленьким, когда оно максимально.

Если окно максимизируется, размер Window будет 1382 х 744 (для того, чтобы «перейти в полноэкранный режим» Это в основном (1366 + 2 * ClientWIndowEdges) х (768 -. Некоторое количество зачищенные от заголовку и снизу).

Вы окно заставляющими быть 1366x768, когда она максимальна, таким образом, фактический Border внутри Window получит меньше мест, 1350x760 или что-то ..

Вы можете удалить MaxWidth и MaxHeight ограничения, когда ваше окно максимальная:

<Window x:Class="myNamespace.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Style> 
     <Style TargetType="Window"> 
      <Style.Setters> 
       <Setter Property="MaxWidth" Value="1366" /> 
       <Setter Property="MaxHeight" Value="768"></Setter> 

      </Style.Setters> 

      <Style.Triggers> 
       <Trigger Property="WindowState" Value="Maximized"> 
        <Setter Property="MaxWidth" Value="9999" /> 
        <Setter Property="MaxHeight" Value="9999"></Setter> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Style> 

    <Grid Background="LightBlue"></Grid> 
</Window> 

Однако я подозреваю, что это не то, что вы хотите. Вы на самом деле хотите иметь ограничения, когда ваш Window максимально. Для этого я предлагаю использовать код-за:

private readonly int _maxHeight = 760; 
private readonly int _maxWidth = 1366; 

public MainWindow() 
{ 
    InitializeComponent(); 

    DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty 
      (WindowStateProperty, typeof (MainWindow)); 

    dpd.AddValueChanged(this, (sender, args) => 
    { 
     if (WindowState == WindowState.Maximized) 
     { 
      var interopHelper = new WindowInteropHelper(this); 
      var barInfo = PInvokeWrapper.GetTitleBarInfoEx(interopHelper.Handle); 

      var borderWidth = barInfo.rcTitleBar.Left; 

      MaxWidth = _maxWidth + borderWidth; 
     } 
     else 
     { 
      MaxWidth = _maxWidth; 
      MaxHeight = _maxHeight; 
     } 
    }); 

    WindowState = WindowState.Normal; 
} 

Идея проста, если окно развернуто, мы пересчитывать MaxWidth свойства, включая ширину кадра. Я нарезал это вместе с несколькими минутами, ему нужно отлаживать несколько машин, чтобы убедиться, что он работает повсюду, но он выглядит «хорошо» для меня.

Для GetTitleBarInfoEx, вы можете проверить эту тему: How do I compute the non-client window size in WPF?