水平ListView中的UserControl不能垂直填充父视图
本文关键字:填充 视图 垂直 不能 ListView 中的 UserControl 水平 | 更新日期: 2023-09-27 18:18:31
我需要水平显示ListView
中每个项目的UserControl
。它可以用StackPanel
完成,但据我所知,StackPanel
将包裹,直到内容可以放置。但是我需要垂直地填充父(在这个例子中是ListView
),就像它的Grid
有多个ListBoxes
。顺便说一下,我的UserControl
是这样的:
<UserControl x:Class="ResourceEditor.LanguagePanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:resources="clr-namespace:ResourceEditor.Resources"
xmlns:viewModel="clr-namespace:ResourceEditor.ViewModel">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="1" LastChildFill="True" DockPanel.Dock="Bottom">
<CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" DockPanel.Dock="Right" IsChecked="{Binding SortByThis}"></CheckBox>
<UniformGrid Columns="2" Rows="0">
<Button Content="{x:Static resources:Strings.Save}" DockPanel.Dock="Left" Command="{Binding SaveCommand}"></Button>
<Button Content="{x:Static resources:Strings.Reset}" DockPanel.Dock="Left" Command="{Binding ResetCommand}"></Button>
</UniformGrid>
</DockPanel>
<ListBox Grid.Row="0" SelectedItem="{Binding SelectedWord}" ItemsSource="{Binding Words}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<command:EventToCommand Command="{Binding Mode=OneTime, Path=EnableEditingCommand}"
PassEventArgsToCommand="False" />
</i:EventTrigger>
</i:Interaction.Triggers>
<ListBox.ItemTemplate>
<HierarchicalDataTemplate DataType="viewModel:WordNodeVM">
<TextBox IsEnabled="{Binding DataContext.CanEdit, RelativeSource={RelativeSource AncestorType=UserControl}}" Text="{Binding Name}"></TextBox>
</HierarchicalDataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
我是这样使用的:
<ListView Grid.Row="2" ItemsSource="{Binding Languages}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Focusable" Value="false"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1" Columns="{Binding Languages.Count}">
</UniformGrid>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<HierarchicalDataTemplate DataType="{ x:Type viewModel:LanguagePanelViewModel}">
<resourceEditor:LanguagePanel DataContext="{Binding}"></resourceEditor:LanguagePanel>
</HierarchicalDataTemplate>
</ListView.ItemTemplate>
</ListView>
我尝试了所有可能的解决方案,改变容器,使用对齐,内容对齐,但不能让我的用户控制填充垂直空间。首先我认为这是UserControl
的问题,因为它的行为像StackPanel
也许,但它不是。
我找不到解决当前问题的方法。但就我想要的行为而言,我是通过这种方式实现的:我从布局中删除了ListView
。增加了空Grid
。在后台代码中,我添加了这个
public MainWindow()
{
var model=new MainViewModel(loadGrid);
DataContext = model;
InitializeComponent();
Closing += (s, e) => ViewModelLocator.Cleanup();
}
void loadGrid(IList<LanguagePanelViewModel> panels)
{
if (panels == null || !panels.Any())
return;
for (int i = 0; i < panels.Count; i++)
{
mainGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star)});
var panel = new LanguagePanel { DataContext = panels[i] };
Grid.SetColumn(panel, i);
mainGrid.Children.Add(panel);
}
}
我试图不打破MVVM规则,这个loadGrid
方法被调用时,我的根据列表的变化。由于这并没有回答问题,我将不接受它作为答案,希望得到一个有力的答案。