2016-03-16 4 views
1

У меня возникли проблемы с тем, чтобы мой UserControl правильно заполнил/изменил размер с помощью родительского окна. Я пишу приложение WPF с использованием MVVM. Я искал другие ответы, и я не смог понять это.WPF UserControl fill mainwindow

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 in MainWindow

Можно ли это сделать в xaml либо UserControl, либо Main Окно? Спасибо

+0

Похоже, как это должно быть. Элементы в ItemsControl имеют размер до своей высоты. Зачем это в ItemsControl? Ожидается ли, что у вас будет несколько разных просмотров? – Will

+0

Когда вы говорите, что вы ожидаете, что место под кнопками будет свернуто, вы имеете в виду, что высота окна должна быть размером элемента управления и кнопок? Или что кнопки должны быть в нижней части окна, и окно остается фиксированным? –

+0

@ Да, я намерен иметь более одного вида (3 специально). Я изменил предложение ItemsPanelTemplate по предложению Рейчел ниже и достигло того поведения, которое я искал. Тем не менее, я не состою в браке с использованием ItemsControl в целом, это просто то, что я нашел в поиске Google. (общее количество здесь нет). Я был бы открыт для предложений по другим способам отображения просмотров :) –

ответ

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}" /> 
+0

Смену ItemsPanelTemplate сделал трюк! Спасибо Рагхель! –

0

Если вы хотите, чтобы окно быть размером контента (включая меню и кнопки ниже 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 имеется немало элементов.

Смежные вопросы