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

C# ItemsControl、ListView、ListBox或DataGrid中可调整大小的行,c#,wpf,C#,Wpf,在ItemsControl、ListView、ListBox或DataGrid上,是否有任何可能的方法可以调整行的大小 我能做我想要的东西的唯一方法是: <UniformGrid Columns="1"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="Aut

ItemsControl
ListView
ListBox
DataGrid
上,是否有任何可能的方法可以调整行的大小

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

<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
,而网格不是。如果网格被任何东西包裹,它的行为就不像我需要它那样

这些控件中有没有内置的方法来实现这一点

有没有其他方法可以创建这样的可调整大小的分区


更糟糕的是,是否有第三方控件可以执行此操作?

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

<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>
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 );
        }
    }
}