ItemsControl、ListView、ListBox或DataGrid中可调整大小的行
本文关键字:可调整 DataGrid ListView ListBox ItemsControl | 更新日期: 2023-09-27 18:27:19
是否有任何可能的方法可以在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>
所以我创建了一个自定义控件,它继承了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 );
}
}
}