WPF UserControl заполнить главное окно
У меня проблемы с получением пользовательского элемента управления, чтобы правильно заполнить / изменить размер родительского окна. Я пишу приложение WPF с использованием MVVM. Я искал другие ответы, и я не смог понять это.
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>
Вот как выглядит дисплей, когда я запускаю его UserControl в MainWindow
Возможно ли сделать это в xaml UserControl или MainWindow? Спасибо
2 ответа
По умолчанию 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}" />
Если вы хотите, чтобы окно соответствовало размеру контента (включая меню и кнопки под 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 немало элементов.