问题
I am having trouble getting my UserControl to properly fill/resize with the parent window. I'm writing a WPF application using MVVM. I've searched for other answers, and I haven't been able to figure this out.
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
<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>
Here's what the display looks like when I launch it UserControl in MainWindow
Is it possible to do this in the xaml of either the UserControl or MainWindow? Thanks
回答1:
An ItemsControl defaults to using a StackPanel
to display data, and StackPanel
limits its size to the size of its children.
Try switching the ItemsPanelTemplate
to something like a DockPanel
instead if you only have one item in your ViewModels
collection :
<ItemsControl ItemsSource="{Binding ViewModels}">
<!-- ItemsPanelTemplate -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
You'll also have to set the ItemContainerStyle
property for DockPanel.Dock="Top"
if you plan on having more than one item, perhaps with a converter so the last item is DockPanel.Dock="Fill"
. Or switch to use a different panel type that also stretches to fill all available space, and allows it's children to stretch as well.
That said, I'd recommend switching to using a ContentControl
instead of an ItemsControl
if you are only displaying one item.
<ContentControl Content="{Binding MyViewModel}" />
回答2:
If you're looking to have the window be the size of the content (including the menu and buttons below the ItemsControl) with the option to have the window grow bigger if more content is available, you can set the SizeToContent property:
<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>
The window will grow in height to fit its contents. In there, you could also set the MaxHeight property so that the window doesn't get too large if the ItemsControl has quite a few items in it.
来源:https://stackoverflow.com/questions/36041315/wpf-usercontrol-fill-mainwindow