为什么我的WPF窗口大小默认变得很大?

26

我有一个包含几个窗体的WPF应用程序。在设计时,它们很小,并且没有设置为自动调整大小。但是,在运行时它们变得特别大,即使里面没有内容也会这样。

为什么会出现这种情况?

这是其中一个窗体:

<Window x:Class="SuperPluginPicker"
             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:tree="clr-namespace:Aga.Controls.Tree;assembly=Aga.Controls" 
             mc:Ignorable="d" 
             d:DesignHeight="296" d:DesignWidth="634" Title="Plugin Selector" WindowStartupLocation="CenterOwner">
    <Grid>
        <DockPanel LastChildFill="true">
            <StackPanel DockPanel.Dock="Bottom" Height="30" Orientation="Horizontal">
                <Button Content="Ok" Name="btnOk" Click="btnOk_Click"></Button>
                <Button Content="Cancel" Name="btnCancel" Click="btnCancel_Click"></Button>

            </StackPanel>
            <StackPanel DockPanel.Dock="Right">
                <Label Content="Selected Plugins"></Label>
            <ListBox Name="lstSelectedPlugins"  Width="200">
                <ListBox.ItemTemplate>



                    <DataTemplate>



                        <Label Content="{Binding Name}" />

                    </DataTemplate>

                </ListBox.ItemTemplate>

            </ListBox>
            </StackPanel>
            <StackPanel DockPanel.Dock="Right" Width="100" VerticalAlignment="Center">
                <Button Content="Add" Name ="btnAdd" Click="btnAdd_Click"></Button>
                <Button Content="Remove" Name="btnRemove" Click="btnRemove_Click"></Button>
                <Button Content="Remove All" Name="btnRemoveAll" Click="btnRemoveAll_Click"></Button>
            </StackPanel>

            <tree:TreeList  x:Name="pluginTree">
                <tree:TreeList.View>
                    <GridView x:Name="treeGrid">
                        <GridView.Columns>

                            <GridViewColumn Width="Auto" Header="Name">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <tree:RowExpander/>

                                            <TextBlock Text="{Binding Name}"></TextBlock>
                                        </StackPanel>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn Header="Author" Width="Auto"  DisplayMemberBinding="{Binding Author}"/>
                            <GridViewColumn Header="Description" Width="Auto" DisplayMemberBinding="{Binding Type}"/>


                        </GridView.Columns>
                    </GridView>
                </tree:TreeList.View>
            </tree:TreeList>
        </DockPanel>
    </Grid>
</Window>

运行时它们的尺寸是多少?634x296? - Anon.
1
我正在使用一台1900x1280的宽屏电脑,但窗口只在屏幕两侧留下大约1/2英寸的空间(顶部、左侧和底部各1/2英寸,右侧可能有2英寸,但仍然非常大)。 - Jason Coyne
可能是未指定SizeToContent时的窗口大小的重复问题。 - paxdiablo
3个回答

41

如果您使用以下代码创建了一个 <Window/>

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />

当你在Visual Studio中运行它时,它会显示一个与你在问题中提到的大小相同的窗口。所以这不是你明确做的事情。

你遇到的是WPF Window的默认计算大小。要获得不同的结果,请像paxdiablo指出的那样,在Window上指定SizeToContent参数,或使用MinHeightMaxHeightHeightMinWidthMaxWidth和/或Width属性来明确设置窗口的大小。


4
顺便提一下,如果你在 MFC、Win32 或 Win16 中创建一个窗口,你会发现得到的默认大小是相同的。例如,Win32 代码 CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 所创建的窗口大小与 WPF 相同。WPF 并没有选择默认大小:Windows 自己使用了一种算法来确定默认大小,这个算法自从 Windows 2.0 在 1987 年推出后就基本保持不变。 - Ray Burns
这是从主屏幕的尺寸计算出来的,是吗? - Rob Perkins
1
我注意到在属性窗格中设置“宽度”和“高度”实际上是设置设计师的宽度和高度,而不是实际的宽度和高度。 - The Muffin Man

12

为什么不只加一个:

Height="296" Width="634"

如何将特定大小应用于Window定义? 我不确定默认大小来自哪里,但我已经在我的窗口上设置了特定大小来解决这个问题。然后我在应用程序启动代码中动态调整大小。

我希望WPF有一个类似于pack的功能,根据子控件的首选大小递归地设置控件(Swing和wxPython都具有此功能),因此您可能要寻找它。


实际上,一些搜索结果显示出 Window.SizeToContent 属性,这可能是你所需要的。它的默认值为Manual,但如果您将其设置为其他值之一(WidthHeight或者WidthAndHeight),您可能会看到更好的呈现效果。

事实上,我刚才转到Windows笔记本电脑并输入:

SizeToContent="WidthAndHeight"

将其添加到窗口定义中,它看起来大小完美。因此,我建议尝试一下,看看是否可以解决(或者至少规避)您的问题。


@Jason:我不确定,但我怀疑它正在查询您的系统指标以获取屏幕大小。我的当前应用程序(我的第一个WPF应用程序)行为类似,即将其居中并在边缘留下一点空间。我记得在某个地方读到过,如果您没有指定宽度和高度,WPF会默认为主监视器的宽度和高度的60%,但也有许多其他因素可能会影响它(尽管我现在找不到该参考文献)。我想我将来会使用“SizeToContent”,而不是依赖于某些微软员工的猜测是否正确 :-) - paxdiablo
我终于找到了链接,不幸的是这个问题已经成为重复了:http://stackoverflow.com/questions/1437099/window-size-when-sizetocontent-is-not-specified - paxdiablo
只要我得到一个好的答案,我可以接受它是重复的。 - Jason Coyne
这不是完全重复的问题,但它的答案涵盖了相同的内容。 - Rob Perkins
无论如何,在WPF中设置固定的宽度和高度是不好的。WPF的一个好处是它会自动适应不同的字体大小,因此如果您更改系统字体,所有内容都会变大。 - Ignacio Soler Garcia
@SoMoS:您好像错过了我说“然后我在应用程序启动代码中动态调整大小”的那部分 :-) 对字体大小等任何更改也会自动使用我的动态调整大小代码。 - paxdiablo

7

设计时您看到的很小,是因为您为窗口混合了设计属性。

d:DesignHeight="296" d:DesignWidth="634"

由于网格是动态布局,它将根据窗口的宽度和高度进行拉伸。为限制窗口大小,您需要在窗口中指定“高度”和“宽度”属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接