gpt4 book ai didi

c# - WPF ItemsControl水平方向并填充父级?

转载 作者:太空狗 更新时间:2023-10-29 22:19:26 33 4
gpt4 key购买 nike

我试图将项目水平放置在 ItemControl 中,同时让它们填充父控件。

这是我的 XAMl:

             <ItemsControl ItemsSource="{Binding AnnualWeatherViewModels}" Visibility="{Binding IsAnnualWeatherViewModels, Converter={StaticResource VisibilityConverter}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<V:AerosolSimpleWeatherCharacteristicsView DataContext="{Binding}"></V:AerosolSimpleWeatherCharacteristicsView>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

我为 ItemsControl.ItemsPanel 尝试的两个变体是:

<StackPanel Orientation="Horizontal"></StackPanel>

和:

<DockPanel LastChildFill="False"></DockPanel>

然而,两者都没有达到预期的效果,StackPanel 压缩了所有的项目,而 DockPanel 要么将父控件的空间填充为专用于最后一项是否填充父空间取决于 LastChildFill 的值。

那么如何水平布置我的 ItemsControl 的项目并让它们填充父控件的空间?

我最终按照答案中的建议创建了这个自定义控件:

public partial class StretchingPanel : Grid
{
public static readonly DependencyProperty OrientationProperty =
DependencyProperty.Register("Orientation", typeof(Orientation), typeof(StretchingPanel), new UIPropertyMetadata(System.Windows.Controls.Orientation.Horizontal));

public static readonly DependencyProperty FillFirstItemProperty =
DependencyProperty.Register("FillFirstItem", typeof(bool), typeof(StretchingPanel), new UIPropertyMetadata(true));

public static readonly DependencyProperty FillFirstItemFactorProperty =
DependencyProperty.Register("FillFirstItemFactor", typeof(double), typeof(StretchingPanel), new UIPropertyMetadata(1.8));

public Orientation Orientation
{
get
{
return (Orientation)GetValue(OrientationProperty);
}
set
{
SetValue(OrientationProperty, value);
}
}

public bool FillFirstItem
{
get
{
return (bool)GetValue(FillFirstItemProperty);
}
set
{
SetValue(FillFirstItemProperty, value);
}
}

public double FillFirstItemFactor
{
get
{
return (double)GetValue(FillFirstItemFactorProperty);
}
set
{
SetValue(FillFirstItemFactorProperty, value);
}
}

protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
{
if (Orientation == System.Windows.Controls.Orientation.Horizontal)
{
ColumnDefinitions.Clear();
for (int i = 0; i < Children.Count; ++i)
{
var column = new ColumnDefinition();
if (i == 0 && FillFirstItem)
column.Width = new GridLength(FillFirstItemFactor, GridUnitType.Star);
ColumnDefinitions.Add(column);
Grid.SetColumn(Children[i], i);
}
}
else
{
RowDefinitions.Clear();
for (int i = 0; i < Children.Count; ++i)
{
var row = new RowDefinition();
if (i == 0 && FillFirstItem)
row.Height = new GridLength(FillFirstItemFactor, GridUnitType.Star);
RowDefinitions.Add(row);
Grid.SetRow(Children[i], i);
}
}
base.OnVisualChildrenChanged(visualAdded, visualRemoved);
}

public StretchingPanel()
{
InitializeComponent();
}
}

最佳答案

UniformGrid 完成这项工作。

        <ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>

关于c# - WPF ItemsControl水平方向并填充父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16512476/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com