ItemsControl、ListView、ListBox或DataGrid中可调整大小的行

本文关键字:可调整 DataGrid ListView ListBox ItemsControl | 更新日期: 2023-09-27 18:27:19

是否有任何可能的方法可以在ItemsControlListViewListBoxDataGrid上调整行的大小?

我能做出我想要的东西的唯一方法是这样的:

<UniformGrid Columns="1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <SomeControlGoesHere />
        <GridSplitter Height="5" Background="Transparent" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Grid.Row="1" />
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <SomeControlGoesHere />
        <GridSplitter Height="5" Background="Transparent" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Grid.Row="1" />
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <SomeControlGoesHere />
        <GridSplitter Height="5" Background="Transparent" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Grid.Row="1" />
    </Grid>
</UniformGrid>

这是一个有3个部分的例子,我可以调整大小。我想让这个数字是任意的,并且有数据绑定,并且能够指定一个模板。

我不能用任何ItemsControl重新创建它,因为项目容器必须是ContentControl,而网格不是。如果网格被包裹在任何东西中,它的行为就不像我需要的那样。

这些控件中有没有内置的方法可以做到这一点?

有没有其他方法可以像这样创建可调整大小的节?

更糟的是,有第三方控制这样做吗?

ItemsControl、ListView、ListBox或DataGrid中可调整大小的行

因此,我发现最好的方法是为此创建正确的网格。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <SomeControl />
    <GridSplitter Height="5" VerticalAlignment="Center" HorizontalAlignment="Stretch" Grid.Row="1" />
    <SomeControl Grid.Row="2" />
</Grid>

所以我创建了一个自定义控件,它继承了Grid,允许我将项目绑定到它;一个是CCD_ 8。

public class BindableGrid : Grid
{
    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( "ItemsSource", typeof( IEnumerable ), typeof( BindableGrid ), new FrameworkPropertyMetadata( null, OnItemsSourceChanged ) );
    public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register( "ItemTemplate", typeof( DataTemplate ), typeof( BindableGrid ), new FrameworkPropertyMetadata( null, OnItemTemplateChanged ) );
    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue( ItemsSourceProperty ); }
        set { SetValue( ItemsSourceProperty, value ); }
    }
    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue( ItemTemplateProperty ); }
        set { SetValue( ItemTemplateProperty, value ); }
    }
    public static void OnItemsSourceChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
    {
        ( (BindableGrid)d ).OnItemsSourceChanged( (IEnumerable)e.OldValue, (IEnumerable)e.NewValue );
    }
    public void OnItemsSourceChanged( IEnumerable oldValue, IEnumerable newValue )
    {
        INotifyCollectionChanged oldValueNotify;
        if( ( oldValueNotify = oldValue as INotifyCollectionChanged ) != null )
        {
            oldValueNotify.CollectionChanged -= ItemsSourceCollectionChanged;
        }
        INotifyCollectionChanged newValueNotify;
        if( ( newValueNotify = newValue as INotifyCollectionChanged ) != null )
        {
            newValueNotify.CollectionChanged += ItemsSourceCollectionChanged;
        }
    }
    public static void OnItemTemplateChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
    {
        ( (BindableGrid)d ).OnItemTemplateChanged( (DataTemplate)e.OldValue, (DataTemplate)e.NewValue );
    }
    public void OnItemTemplateChanged( DataTemplate oldItemTemplate, DataTemplate newItemTemplate )
    {
    }
    private void ItemsSourceCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
    {
        if( e.Action == NotifyCollectionChangedAction.Reset )
        {
            RowDefinitions.Clear();
            Children.Clear();
        }
        else if( e.Action == NotifyCollectionChangedAction.Add )
        {
            AddItems( e.NewItems );
        }
        else
        {
            throw new InvalidOperationException( string.Format( "Action '{0}' is not valid.", e.Action ) );
        }
    }
    private void AddItems( IList items )
    {
        foreach( var item in items )
        {
            if( Children.Count > 0 )
            {
                RowDefinitions.Add( new RowDefinition { Height = GridLength.Auto } );
                var gridSplitter = new GridSplitter
                {
                    Height = 5,
                    Background = new SolidColorBrush( Color.FromArgb( 255, 0, 0, 0 ) ),
                    VerticalAlignment = VerticalAlignment.Center,
                    HorizontalAlignment = HorizontalAlignment.Stretch,
                };
                SetRow( gridSplitter, Children.Count );
                Children.Add( gridSplitter );
            }
            RowDefinitions.Add( new RowDefinition
            {
                Height = new GridLength( 1, GridUnitType.Star ),
                MinHeight = 40,
            } );
            var contentPresenter = new ContentPresenter();
            contentPresenter.SetValue( ContentPresenter.ContentTemplateProperty, ItemTemplate );
            contentPresenter.Content = item;
            SetRow( contentPresenter, Children.Count );
            Children.Add( contentPresenter );
        }
    }
}