I had to introduce the Attached Dependency property to handle this in my own application:
<Grid c:GridSplitterController.Watch="{Binding ElementName=GS_DetailsView}"> <Grid.RowDefinitions> <RowDefinition Height="1*" /> <RowDefinition Height="200" /> </Grid.RowDefinitions> <SomeControl Grid.Row="0" /> <GridSplitter x:Name="GS_DetailsView" Height="4" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Stretch" ResizeBehavior="PreviousAndCurrent" ResizeDirection="Rows" Visibility="{Binding ShowDetails, Converter={StaticResource boolvis}}" /> <OtherControl Grid.Row="1" Margin="0,4,0,0" Visibility="{Binding ShowDetails, Converter={StaticResource boolvis}}" /> </Grid>
First, define a suitable attached property on DependencyObject :
public static GridSplitter GetWatch(DependencyObject obj) { return (GridSplitter)obj.GetValue(WatchProperty); } public static void SetWatch(DependencyObject obj, GridSplitter value) { obj.SetValue(WatchProperty, value); } public static readonly DependencyProperty WatchProperty = DependencyProperty.RegisterAttached( "Watch", typeof(GridSplitter), typeof(DependencyObject), new UIPropertyMetadata(null, OnWatchChanged));
Then listen to IsVisibleChanged :
private static void OnWatchChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { if (obj == null) return; if (obj is Grid) { var grid = obj as Grid; var gs = e.NewValue as GridSplitter; if (gs != null) { gs.IsVisibleChanged += (_sender, _e) => { UpdateGrid( grid, (GridSplitter)_sender, (bool)_e.NewValue, (bool)_e.OldValue); }; } } }
After viewing these changes, you need to save or restore the GridLength values ββfrom the row or columns that you are viewing (for brevity, I only include rows):
All that remains is a suitable implementation of GetPrevious and GetNext :
private static int GetPrevious(GridSplitter gridSplitter, int index) { switch (gridSplitter.ResizeBehavior) { case GridResizeBehavior.PreviousAndNext: case GridResizeBehavior.PreviousAndCurrent: return index - 1; case GridResizeBehavior.CurrentAndNext: return index; case GridResizeBehavior.BasedOnAlignment: default: throw new NotSupportedException(); } } private static int GetNext(GridSplitter gridSplitter, int index) { switch (gridSplitter.ResizeBehavior) { case GridResizeBehavior.PreviousAndCurrent: return index; case GridResizeBehavior.PreviousAndNext: case GridResizeBehavior.CurrentAndNext: return index + 1; case GridResizeBehavior.BasedOnAlignment: default: throw new NotSupportedException(); } }