Моя проблема похожа на приведенный выше вопрос, но немного отличается, потому что ни подход IsSharedSizeScope
не решил ее для меня, ни Binding with ActualWidth.Итак, я публикую другое решение, надеясь, что кто-то найдет это полезным.Итак, вот проблема, которую мне нужно было решить:
У меня есть приложение, в котором у меня есть элемент управления с разделенным видом - см. Синюю часть ниже - и хотя мне нравится иметь GridSplitter в серединедисплей Я хочу реализовать синюю часть в отдельном элементе управления, в то время как часть сверху должна быть реализована в отдельной сборке: ... но GridSplitter должен пройти весь путь через основнойпросматривать и соединять обе области, не имея представления о фактическом разделении.Я достиг этого, установив ширину столбцов при каждом перетаскивании TopSplitter
или MainSplitter
.
Этот подход не имеет штрафов за производительность и работает со столбцами размера *.* Оказывается, что синхронизация двух или более GridSplitters (как в этом случае) фактически требует от нас синхронизации ширины столбцов, которые «изменяются» с помощью GridSplitter.Перетащите Top- или MainSplitter, и вы увидите, что другая область изменяет размеры, как если бы это был один сплиттер: -)
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="3,3,3,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" Name="TopColumnA"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" Name="TopColumnB"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="AntiqueWhite"
Margin="0,0,3,3"
/>
<GridSplitter
Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" Name="TopSplitter"
HorizontalAlignment="Stretch"
Background="Gray" Width="6"
DragCompleted="GridSplitter_DragCompleted"
DragDelta="MainSplitter_DragDelta"
/>
<TextBlock Grid.Column="2" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="AntiqueWhite"
Margin="3,0,0,3"
/>
</Grid>
<Grid Grid.Row="1" Margin="3,0,3,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" Name="MainColumnA"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" Name="MainColumnB"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="Aqua"
Margin="0,0,3,0"
/>
<GridSplitter
Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" Name="MainSplitter"
HorizontalAlignment="Stretch"
Background="Black" Width="6"
DragCompleted="GridSplitter_DragCompleted"
DragDelta="MainSplitter_DragDelta"
/>
<TextBlock Grid.Column="2" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="Aqua"
Margin="3,0,0,0"
/>
</Grid>
</Grid>
... и вот необходимый код позади:
private void GridSplitter_DragCompleted(object sender, DragCompletedEventArgs e)
{
if (sender == MainSplitter)
{
TopColumnA.Width = MainColumnA.Width;
TopColumnB.Width = MainColumnB.Width;
}
else
{
if (sender == TopSplitter)
{
MainColumnA.Width = TopColumnA.Width;
MainColumnB.Width = TopColumnB.Width;
}
}
}
private void MainSplitter_DragDelta(object sender, DragDeltaEventArgs e)
{
if (sender == MainSplitter)
{
TopColumnA.Width = MainColumnA.Width;
TopColumnB.Width = MainColumnB.Width;
}
else
{
if (sender == TopSplitter)
{
MainColumnA.Width = TopColumnA.Width;
MainColumnB.Width = TopColumnB.Width;
}
}
}