WPF UserControl填充主窗口

时间:2016-03-16 16:19:45

标签: c# wpf mvvm viewusercontrol

我无法让UserControl正确填充/调整父窗口的大小。我正在使用MVVM编写WPF应用程序。我已经搜索了其他答案,但我还没有想到这一点。

MainWindow.xaml

<Window x:Class="QiXR.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:QiXR.ViewModel"
    xmlns:vw="clr-namespace:QiXR.View"
    Title="MainWindow">
<Window.Resources>
    <DataTemplate DataType="{x:Type vm:XRTestCaseListViewModel}">
        <vw:XRTestCaseListView/>
    </DataTemplate>

</Window.Resources>
<Grid>
    <ItemsControl ItemsSource="{Binding ViewModels}" />
</Grid>

用户控件

<UserControl x:Class="QiXR.View.XRTestCaseListView"
         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"
         VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<UserControl.Resources>
    <Style x:Key="DataGridCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
    </Style>
</UserControl.Resources>

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="160"/>
        <ColumnDefinition Width="160"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="45"/>
    </Grid.RowDefinitions>

这是我启动时显示的样子 UserControl in MainWindow

是否可以在UserControl或MainWindow的xaml中执行此操作?感谢

2 个答案:

答案 0 :(得分:0)

ItemsControl默认使用StackPanel来显示数据,StackPanel将其大小限制为其子级的大小。

如果您的ItemsPanelTemplate集合中只有一个项目,请尝试将DockPanel切换为类似ViewModels的内容:

<ItemsControl ItemsSource="{Binding ViewModels}">
    <!-- ItemsPanelTemplate -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <DockPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

如果您计划拥有多个项目,或者使用转换器,那么您还必须为ItemContainerStyle设置DockPanel.Dock="Top"属性,以便最后一项为DockPanel.Dock="Fill"。或者切换到使用不同的面板类型,它也会拉伸以填充所有可用空间,并允许它的孩子也可以伸展。

也就是说,如果您只显示一个项目,我建议您使用ContentControl代替ItemsControl

<ContentControl Content="{Binding MyViewModel}" />

答案 1 :(得分:-1)

如果您希望窗口具有内容的大小(包括ItemsControl下面的菜单和按钮),并且如果有更多内容可供选项让窗口变大,则可以设置SizeToContent属性:

<Window x:Class="Project.Window"
    x:Name="userControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" MaxHeight="700"
    SizeToContent="Height" WindowStartupLocation="CenterScreen">

</Window>

窗口的高度会增加以适应其内容。在那里,您还可以设置MaxHeight属性,以便在ItemsControl中包含相当多的项目时窗口不会太大。