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 немало элементов.

Другие вопросы по тегам