Поскольку мое приложение WPF несколько раз использует GridSplitter
s, я хочу извлечь этот фрагмент XAML в отдельный UserControl
.GridSplitter действует по-разному при перемещении на внешний ресурс (UserControl)
Конечно, использование ResourceDictionary
будет приятнее. Но таким образом, я могу только определить ControlTemplate
для содержимого сплиттера и использовать его в пределах Template
-атрибута впоследствии - который удаляет возможность определять все эти атрибуты GridSplitter
только один раз, а затем последовательно их использовать.
GridSplitter
UserControl
, GridSplitter.xaml:
<GridSplitter HorizontalAlignment="Stretch" Margin="3" ResizeBehavior="PreviousAndNext"
ResizeDirection="Columns" VerticalAlignment="Stretch">
<GridSplitter.Template>
<ControlTemplate TargetType="{x:Type GridSplitter}">
<Grid>
<Button Content="⁞" />
<Rectangle Fill="#00FFFFFF" />
</Grid>
</ControlTemplate>
</GridSplitter.Template>
</GridSplitter>
Использование в MainWindow.xaml:
<Window
(...)
xmlns:uc="clr-namespace:Yoda.Frontend.Resources"
(...)>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="100" Width="200" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition MinWidth="400" Width="*" />
</Grid.ColumnDefinitions>
<!-- (...) -->
<uc:GridSplitter Grid.Column="1" />
<!-- (...) -->
</Grid>
<!-- (...) -->
</Window>
Результат использования приведенный выше код является сплиттер, который может Не двигайтесь в любом направлении.
Однако, используя упомянутый выше подход для словаря ResourceDictionary
, я получаю подвижный GridSplitter
.
Но, несмотря на то, что он отлично работает непосредственно в MainWindow.xaml, он только изменяет размеры третьей колонки сетки.
Уверенный, установка Width
не рекомендуется при использовании GridSplitter
. Но почему он работает всякий раз, когда разделитель определяется в главном окне и только не делает этого при использовании в качестве UserControl
? И как исправить это в MVVM, без кода?
Прежде всего: благодаря _A lot_ этого _awesome_ и разнообразный ответ. Я перепутал, что 'ControlTemplate' нужно определять в стиле' Style', а не наоборот. Оттуда я даже смог улучшить ваш ответ. :) Итак, я с радостью принимаю ваш ответ, как только вы можете прояснить одну оставшуюся проблему: почему мне нужно переключиться с «StaticResource» на «DynamicResource», чтобы избежать исключений во время выполнения? ** Примечание: ** Я определил «GridSplitter» в отдельном файле XAML для включения в «ResourceDictionary.MergedDictionaries» App.xaml (рядом с одним для «ContextMenu», который не связан). – Yoda
Решения, которые я предложил, не используют другой элемент управления, но по умолчанию тот, который присутствует в WPF. Ваше решение теперь использует контроль, сделанный вами? –
Нет, я просто переключился на третье решение (с добавлением, которое я упомянул в своем первом комментарии к отдельному файлу и включая этот файл в «ResourceDictionary.MergedDictionaries» App.xaml). BTW: Спасибо, что намекнул мне на «IsHitTestVisible»!:) – Yoda