C# 当最大化时,我的WPF ChromeWindow略微变差
因此,我构建了这个示例应用程序,并将自定义WindowChrome与WPF和C#结合使用。每次我尝试使用我制作的按钮最大化我的窗口时,最大化的窗口都会稍微关闭?像几个像素。发生了什么事C# 当最大化时,我的WPF ChromeWindow略微变差,c#,.net,wpf,C#,.net,Wpf,因此,我构建了这个示例应用程序,并将自定义WindowChrome与WPF和C#结合使用。每次我尝试使用我制作的按钮最大化我的窗口时,最大化的窗口都会稍微关闭?像几个像素。发生了什么事 <Window x:Class="TestApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.c
<Window x:Class="TestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestApp"
mc:Ignorable="d"
Title="TestApp"
WindowStyle="None"
WindowStartupLocation="CenterScreen"
MinHeight="500" MinWidth="940">
<WindowChrome.WindowChrome>
<WindowChrome
ResizeBorderThickness="6"
CaptionHeight="20"
GlassFrameThickness="0"
CornerRadius="0"
/>
</WindowChrome.WindowChrome>
<!-- Application -->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="26" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- WindowChrone Header -->
<Grid Background="{StaticResource WindowChromeBrush}" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="RelayC" />
<Button Click="MinimizeWindow" Grid.Column="2" Style="{StaticResource WindowChromeButton}">
<Image Source="{StaticResource window_minimize_icon}"/>
</Button>
<Button Click="MaximizeWindow" Grid.Column="3" Style="{StaticResource WindowChromeButton}">
<Image Source="{StaticResource window_maximize_icon}" />
</Button>
<Button Click="CloseWindow" Grid.Column="4" Style="{StaticResource WindowChromeButton}">
<Image Source="{StaticResource window_close_icon}" />
</Button>
</Grid>
<!--- Main Content -->
<Grid Grid.Row="1">
</Grid>
</Grid>
</Window>
我做错了什么?我最终找到了一种解决这个问题的优雅方法。我只是给最外层的网格指定了一个名称,在它被最大化时被检测到,并添加了一个边距,以确保应用程序完全覆盖了屏幕,而不是被覆盖。然后,当屏幕大小改变时,我会删除所说的边距 以下是我的一些代码: 主要功能:
private bool isMaximized = false;
private void CheckMaximizeChange(object sender, SizeChangedEventArgs e)
{
if (WindowState == WindowState.Maximized || (isMaximized && WindowState != WindowState.Minimized)) ChangeWindow();
}
private void MaximizeWindow(object sender, RoutedEventArgs e) => this.WindowState ^= WindowState.Maximized;
private void ChangeWindow()
{
isMaximized = !isMaximized;
MaximizeImageButton.Source = FindResource(MaximizeImageButton.Source == FindResource("window_maximize_icon") ? "window_restore_icon" : "window_maximize_icon") as DrawingImage;
MainGrid.Margin = new Thickness(MainGrid.Margin == new Thickness(0) ? 7 : 0);
}
然后在应用程序的构造函数中:
SizeChanged += CheckMaximizeChange;
当您打开任何应用程序(比如记事本)时,您将看到noptepad周围有一个边框,可以调整窗口大小。当您将其最大化时,请注意边框不再可见,并且无法调整大小。这是应用程序的非客户端区域。通过提供自定义windowchrome,您已经占用了包括非客户端区域在内的全部空间,因此当您最大化非客户端区域时,它位于桌面可视区域之外,类似于记事本边框。在窗口上添加一个触发器,以最大化属性来放置一些边距。哦,好的,我尝试过这样做,但当我说将我的应用程序拖到屏幕顶部以最大化窗口而不是按最大化按钮时,它不起作用?我建议看一下这段youtube视频。他通过调整大小解决了所有问题。整体而言,这是一个相当深入的系列。哈哈,事实上我最终还是看了这部电影,但最终我自己找到了一个不那么复杂的解决方案!谢谢你!
SizeChanged += CheckMaximizeChange;