Окно вне экрана при максимальном использовании с помощью библиотеки интеграции оболочки WPF
Я использую библиотеку интеграции WPF Shell, чтобы создать собственный хром моего приложения wpf.
Все хорошо, но при максимальном использовании приложения 6 или 7 пикселей находятся вне экрана.
Это код, который я использую:
<Style TargetType="{x:Type local:MainWindow}">
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome
ResizeBorderThickness="6"
CaptionHeight="10"
CornerRadius="0"
GlassFrameThickness="1"/>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MainWindow}">
<Grid>
<Border BorderThickness="1" BorderBrush="#389FD1" Background="#389FD1">
<ContentPresenter Margin="0,22,0,0" Content="{TemplateBinding Content}"/>
</Border>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" >
<TextBlock Text="{Binding NombreUsuario}" Foreground="White" Margin="5,5,20,5" Opacity=".8" />
<Button Style="{StaticResource ImageButton}" Height="20" Width="20" Margin="0" Click="WindowMinimize" shell:WindowChrome.IsHitTestVisibleInChrome="True">
<Image Height="10" Width="10" Source="/Resources/Images/minimize.png" />
</Button>
<Button Style="{StaticResource ImageButton}" Height="20" Width="20" Margin="0" Click="WindowMaximizeRestore" shell:WindowChrome.IsHitTestVisibleInChrome="True" >
<Image Height="10" Width="10" Source="/Resources/Images/maximize.png" />
</Button>
<Button Style="{StaticResource ImageButton}" Height="20" Width="20" Margin="0" Click="WindowClose" shell:WindowChrome.IsHitTestVisibleInChrome="True">
<Image Height="10" Width="10" Source="/Resources/Images/close.png" />
</Button>
</StackPanel>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Ответы
Ответ 1
Окна обрезают края окна, когда он максимизируется, чтобы затушевать то, что обычно будет краем изменения размера. Вы можете обойти это, установив границу прокси между окном и вашим контентом, а затем раздуйте толщину, когда она будет максимальной.
Я изменил пример, который пришел с lib, чтобы сделать это, то же самое базовое изменение может быть сделано в вашем примере:
<ControlTemplate TargetType="{x:Type local:SelectableChromeWindow}">
<Border BorderBrush="Green">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Setter Property="BorderThickness" Value="0"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ThisWindow, Path=WindowState}" Value="Maximized">
<Setter Property="BorderThickness" Value="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowResizeBorderThickness}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid [...]/>
</Border>
</ControlTemplate>
Я надеюсь, что это поможет.
Для .net 4.5 и выше,, SystemParameters немного отличаются друг от друга, например:
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}, Path=WindowState}" Value="Maximized">
<Setter Property="BorderThickness" Value="{Binding Source={x:Static SystemParameters.WindowResizeBorderThickness}}"/>
</DataTrigger>
Ответ 2
это сработало для меня:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
xmlns:Views="clr-namespace:BorderLessWpf.Views">
<Style TargetType="{x:Type Views:ShellView}" >
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome
ResizeBorderThickness="6"
CaptionHeight="10"
CornerRadius="0"
GlassFrameThickness="1"/>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="WindowState" Value="Maximized">
<Setter Property="BorderThickness" Value="6" />
</Trigger>
</Style.Triggers>
</Style>
Ответ 3
Чтобы решить проблему выхода окна с экрана, просто установите:
this.ResizeMode = System.Windows.ResizeMode.NoResize;
См. JAPF "Настроить главное окно вашего проекта WPF"
для получения дополнительной информации.
Ответ 4
Из здесь, я подумал, что попробую установить WindowChrome.NonClientFrameEdges
.
При некоторых экспериментах выясняется, что вы можете получить желаемый эффект, установив его NonClientFrameEdges.Bottom
при максимальном увеличении и вернув его к NonClientFrameEdges.None
, когда он не будет максимальным.
Это заставляет маржу исчезать на всех краях, кроме нижней, но, тем не менее, приводит к тому, что перекрытие под панелью задач больше не происходит.
Важно, чтобы WindowChrome был установлен до WindowState, поэтому в моем кодовом замке у меня есть функции (MainGrid2 содержит все содержимое окна, запрещающее строку состояния, а StatusGrid содержит строку состояния):
private void Maximise()
{
StatusGrid.Margin = new Thickness(7, 0, 7, 0);
MainGrid2.Margin = new Thickness(12, 12, 12, 0);
chrome.NonClientFrameEdges = NonClientFrameEdges.Bottom;
WindowChrome.SetWindowChrome(this, chrome);
WindowState = System.Windows.WindowState.Maximized;
}
private void Restore()
{
StatusGrid.Margin = new Thickness(0);
MainGrid2.Margin = new Thickness(5, 5, 5, 0);
chrome.NonClientFrameEdges = NonClientFrameEdges.None;
WindowChrome.SetWindowChrome(this, chrome);
WindowState = System.Windows.WindowState.Normal;
}
Ответ 5
В моем проекте у меня CaptionHeight установлен на 0 и ResizeMode установлен на CanResizeWithGrip. Это код, который я придумал для правильной толщины.
Thickness maximizeFix = new Thickness(SystemParameters.WindowNonClientFrameThickness.Left +
SystemParameters.WindowResizeBorderThickness.Left,
SystemParameters.WindowNonClientFrameThickness.Top +
SystemParameters.WindowResizeBorderThickness.Top
- SystemParameters.CaptionHeight,
SystemParameters.WindowNonClientFrameThickness.Right +
SystemParameters.WindowResizeBorderThickness.Right,
SystemParameters.WindowNonClientFrameThickness.Bottom +
SystemParameters.WindowResizeBorderThickness.Bottom);
Я собираюсь использовать границу, как это сделал Джо Кастро, а затем привязать толщину к свойству, которое я обновляю при изменении состояния окна.
Код кажется janky, но я еще не нашел другого решения.