当窗口最大化时,如何使所有控件按比例调整大小?

Sha*_*awn 39 wpf mvvm c#-4.0

当我单击最大化按钮时,窗口最大化但控件未按比例调整大小.使控件调整大小的最佳方法是什么?我正在使用MVVM.

这是我的代码.

<Window x:Class="DataTransfer.View.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Icon="/DataTransfer;component/View/Images/ms_msnexplore.gif"

        ResizeMode="CanResizeWithGrip"
        Title="Window1" Height="500" Width="600">
    <!--Style="{DynamicResource OfficeStyle}"-->
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!--<ResourceDictionary Source="/DataTransfer;component/View/WindowBase.xaml" />-->
                <!--<ResourceDictionary Source="/DataTransfer;component/Themes/WPFThemes/CalendarResource.xaml" />-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width ="*" />
    </Grid.ColumnDefinitions>
        <Button Content="Button" HorizontalAlignment="Left" Margin="52,28,0,0" VerticalAlignment="Top" Width="75" Height="22" />
        <DatePicker Name="dp" HorizontalAlignment="Left" Margin="175,25,0,0" VerticalAlignment="Top" Width="123" Text="aaa" GotFocus="DateGotFocused" LostFocus="OnLeaveArchiveDate"/>
        <Calendar HorizontalAlignment="Left" Margin="47,162,0,0" VerticalAlignment="Top"/>
        <TextBox Name="t1" HorizontalAlignment="Left" Height="23" Margin="337,23,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" LostFocus="LeaveField" />
        <RadioButton Content="RadioButton" HorizontalAlignment="Left" Margin="88,92,0,0" VerticalAlignment="Top"/>
        <CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin="252,96,0,0" VerticalAlignment="Top"/>
        <ComboBox Name="combo" IsEditable="False" Text="aaa" IsReadOnly="True"
                  HorizontalAlignment="Left" Margin="337,89,0,0" VerticalAlignment="Top" Width="120" 
                  Focusable="True" GotFocus="ComboBoxGotFocused" >
            <ComboBoxItem>January</ComboBoxItem>
            <ComboBoxItem>February</ComboBoxItem>
        </ComboBox>
        <TextBlock HorizontalAlignment="Left" Height="40" Margin="260,184,0,0" TextWrapping="Wrap" Text="Text_Block" VerticalAlignment="Top" Width="257"/>

    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

She*_*dan 88

在WPF中,某些"容器"控件会自动调整其内容的大小,而有些则不会.

以下是一些调整其内容的内容(我猜你正在使用其中一个或多个):

StackPanel
WrapPanel
Canvas
TabControl
Run Code Online (Sandbox Code Playgroud)

这里有一些调整它们的内容:

Grid
UniformGrid
DockPanel
Run Code Online (Sandbox Code Playgroud)

因此,除非您希望自动调整大小,否则几乎总是优先使用a Grid而不是a .请注意,它仍然是可能的,以大小其内部控制......这一切都取决于你和设置:StackPanelGridGrid.RowDefinitionGrid.ColumnDefinition

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="100" /> <!--<<< Exact Height... won't resize -->
        <RowDefinition Height="Auto" /> <!--<<< Will resize to the size of contents -->
        <RowDefinition Height="*" /> <!--<<< Will resize taking all remaining space -->
    </Grid.RowDefinitions>
</Grid>
Run Code Online (Sandbox Code Playgroud)

您可以Grid从MSDN上的" Grid类"页面中找到有关控件的更多信息.您还可以从MSDN上的WPF容器控件概述页面找到有关这些容器控件的更多信息.

使用FrameworkElement.HorizontalAlignmentFrameworkElement.VerticalAlignment属性可以实现进一步的大小调整.这些属性的默认值是Stretch拉伸元素以适合其包含控件的大小.但是,当它们设置为任何其他值时,元素将不会拉伸.

更新>>>

回答您评论中的问题:

使用Grid.RowDefinitionGrid.ColumnDefinition设置首先组织基本结构... 如果需要,通常将Grid控件添加到外部Grid控件的单元格中.您还可以使用Grid.ColumnSpanGrid.RowSpan属性来启用控件以跨越a的多个列和/或行Grid.

这是最常用的至少有一排/与列Height/ Width"*"这将填补所有的剩余空间,但你可以有两个或两个以上使用此设置,在这种情况下,剩余的空间将两个(或更多)之间拆分行/列."自动"是一个很好的设置,可用于未设置为""*"'的行/列,但它实际上取决于您希望布局的方式.

没有Auto设置,你可以在细胞中的控件使用,但是这仅仅是为好,因为我们要Grid为我们的大小控制.所以,我们不想设置HeightWidth这些控件的所有.

关于FrameworkElement.HorizontalAlignmentFrameworkElement.VerticalAlignment属性的观点只是让你知道它们的存在......因为它们的默认值已经存在Stretch,你通常不需要明确地设置它们.

Margin属性通常仅用于将控件均匀分布...如果从Visual Studio工具箱中拖放控件,VS将设置Margin属性以将控件准确放置在放置它的位置但通常,这不是我们想要的因为它会混淆控件的自动调整大小.如果您这样做,那么只需删除或编辑Margin属性以满足您的需求.