WPF自定义ProgressWindow运行时嵌入空白大窗口的异常问题
问题:ProgressWindow运行时显示在巨大空白窗口内的原因及解决办法
我创建了一个带有ProgressBar的小型ProgressWindow,在XAML编辑器中显示正常,无任何问题。但在后台代码中创建并显示该窗口时,ProgressWindow却显示在一个巨大的空白白色窗口内部,这是什么原因?
编辑器显示效果:
运行时显示效果:
原XAML代码
<Window x:Class="MyStyling.Control.ProgressWindow" 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" xmlns:local="clr-namespace:MyStyling.Control" WindowStyle="none" ResizeMode="NoResize"> <Border x:Name="Xaml_ProgressWindow_ID" Width="320" BorderThickness="1" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" Background="{DynamicResource MyBackgroundBrush}" VerticalAlignment="Center" Padding="0,0,0,20"> <Border.Effect> <DropShadowEffect Color="Gray" Direction="300" BlurRadius="10" Opacity="0.5" ShadowDepth="10" /> </Border.Effect> <StackPanel> <StackPanel x:Name="XAML_SP_ProgressBar1_ID"> <Label x:Name="XAML_LBL_ProgressBar1_ID" Content="Main progress bar ..." HorizontalAlignment="Center" /> <ProgressBar x:Name="XAML_PG_ProgressBar1_ID" Height="5" Margin="20,0,19,0" Background="White" Foreground="Black" /> </StackPanel> <StackPanel x:Name="XAML_SP_ProgressBar2_ID" Margin="0,10,0,0"> <Label x:Name="XAML_LBL_ProgressBar2_ID" Content="Secondary progress bar" HorizontalAlignment="Center" FontSize="11" /> <ProgressBar x:Name="XAML_PG_ProgressBar2_ID" Height="5" Margin="20,0,19,0" Background="White" Foreground="Black" /> </StackPanel> </StackPanel> </Border>
原因及解决办法
核心问题是Window本身没有设置尺寸约束:你只给内部的Border设置了固定宽度,但Window默认会拉伸到可用空间(比如屏幕大小),再加上WindowStyle="none"去掉了标题栏的尺寸限制,运行时就会出现内部内容缩在巨大空白窗口里的情况。而XAML编辑器会自动根据内部元素尺寸渲染预览,所以显示正常。
有两种简单的解决方式:
方式1:手动指定Window宽度,高度自适应内容
给Window标签添加Width="320"(和内部Border宽度一致),再设置SizeToContent="Height"让窗口高度自动匹配内部内容:
<Window x:Class="MyStyling.Control.ProgressWindow" 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" xmlns:local="clr-namespace:MyStyling.Control" WindowStyle="none" ResizeMode="NoResize" Width="320" SizeToContent="Height">
方式2:让Window自动适配内部所有内容
给Window设置SizeToContent="WidthAndHeight",这样窗口会完全根据内部元素的尺寸自动调整自身大小,无需手动设置宽高:
<Window x:Class="MyStyling.Control.ProgressWindow" 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" xmlns:local="clr-namespace:MyStyling.Control" WindowStyle="none" ResizeMode="NoResize" SizeToContent="WidthAndHeight">
内容的提问来源于stack exchange,提问作者xNiux
相关产品推荐
相关产品推荐

