原文:
WPF 窗口大小自适应
在设置桌面不同分辨率以及较大DPI下,窗口如何显示的问题。
方案一 设置窗口最大值和最小值显示
通过对比当前屏幕的可显示区域,将窗口高宽最大值和最小值,设置为窗口的实际高宽(此例中仅设置高度)
界面设置
- 设置窗口内容自适应SizeToContent="WidthAndHeight"
- 添加ViewBox -- 设置默认不拉伸Stretch="None",当DPI超大时如超过1920*1080p的175%(即win10默认不支持的比例显示),开启ViewBox缩放
- 顶层布局容器RootGrid添加高宽最大值和最小值。
1 <Window x:Class="WindowHeightChangedForDpi.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WindowHeightChangedForDpi" 7 mc:Ignorable="d" 8 Title="MainWindow" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen"> 9 <Viewbox x:Name="RootViewbox" Stretch="None"> 10 <Grid x:Name="RootGrid" Width="1000" MaxHeight="680" MinHeight="520" ClipToBounds="True"> 11 12 </Grid> 13 </Viewbox> 14 </Window>
后台设置 - 窗口大小自适应设置
- 添加对Loaded事件的监听,并在之后注销。窗口只需要首次初始其高度即可。
- 获取屏幕的高度和任务栏的高度 -- 具体可以参考C# 获取当前屏幕的宽高和位置
- 比较当前可显示高度(屏幕高度-任务栏高度)与窗口的最大/最小高度,然后设置当前窗口的实际高度。
- 如果可显示高度比最小值还小,则开启ViewBox内容缩放。ViewBox的高度为当前可显示高度。
- 如果当前窗口有阴影,可设置阴影高度大小。保证窗口在可显示区域内正常显示。
1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 InitializeComponent(); 6 Loaded += InitWindowActualHeight_OnLoaded; 7 } 8 9 #region 设置窗口对屏幕高度的自适应 10 11 private void InitWindowActualHeight_OnLoaded(object sender, RoutedEventArgs e) 12 { 13 Loaded -= InitWindowActualHeight_OnLoaded; 14 InitWindowActualHeight(); 15 } 16 17 private const double WindowShadowHeight = 0; 18 19 private void InitWindowActualHeight() 20 { 21