1.GridSplitter的ShowsPreview设置为True时拖动报null错误
解决方法在Grid外面包装一个装饰器:AdornerDecorator,至于为什么这么做,暂时还不知道
2.当ShowsPreview设置为True时,可以设置鼠标拖动的时候动态效果,具体方法是设置PreviewStyle
另外这个PreviewStyle的TargetType只针对Control的,因为在GridSplitter类定义上有StyleTypedPropertyAttribute
<GridSplitter Grid.Row="0" Height="28" VerticalAlignment="Bottom" ShowsPreview="True" HorizontalAlignment="Stretch" Background="Transparent"> <GridSplitter.PreviewStyle> <Style TargetType="Control"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Control"> <Rectangle Height="3" Fill="#808080"/> </ControlTemplate> </Setter.Value> </Setter> </Style> </GridSplitter.PreviewStyle> </GridSplitter>
3.有时拖动的时候会出现鼠标拖动超出了边界的效果,出现这个的问题是由于没有设置Grid的行或者列的最大最小值,当设置好这个最大最小值后就没有问题了:
<Grid.RowDefinitions> <RowDefinition Height="*" MinHeight="140"></RowDefinition> <RowDefinition Height="64" MinHeight="64" MaxHeight="250"></RowDefinition> </Grid.RowDefinitions>
另外需要注意:在设置时最好是第一行的最小值+第二行的最大值小于总的高度,这样在拖动的时候边界的效果是最好的
假如Grid的高度是500,第一行的最小高度是150,那么第二行的最大高度就设置为<=350
4.如何设置GridSplitter时左右拖动还是上下拖动,可以设置ResizeBehavior属性
ResizeBehavior属性默认是GridResizeBehavior.BasedOnAlignment。这个枚举值,简而言之:如果HorizontalAlignment或VerticalAlignment是Center或者Stretch的话,GridSplitter的移动会改变相邻两个区域块(这里的相邻,如果GridSplitter是横向的话,是指上下两个区域。如果GridSplitter是纵向的话,是指左右两块区域,其中VerticalAlignment控制纵向,HorizontalAlignment控制横向)。如果是HorizontalAlignment或VerticalAlignment的其他值,则GridSplitter的移动会改变当前区域和相邻的一个区域的大小。具体相邻的哪个区域,跟Alignment值对应。
当然GridResizeBehavior的其他值:CurrentAndNext,PreviousAndCurrent,PreviousAndNext。可以直接控制需要改变大小的两个区域。
不过在一般情况下,我们只需要保留ResizeBehavior的默认值,并设置GridSplitter的对其为Stretch或Center就可以完成普通需求了。或者将相邻区域块的大小设置为GridLength.Auto。
注意FrameworkElement的HorizontalAlignment和VerticalAlignment默认是Stretch,但是GridSplitter的HorizontalAlignment被改写为Right。
文章参考:https://www.mgenware.com/blog/?p=45