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