Как создать окно шаблона в WPF?
Итак, я создаю приложение, в котором будет много окон, все с одинаковой базовой компоновкой:
- Главное окно
- Логотип в верхнем углу
- Заголовочный блок
- Индикатор состояния внизу
- Область для элементов управления, специфичных для окна.
В настоящий момент мне нужно воссоздать эту структуру в каждом окне. В идеале я хочу, чтобы этот макет был закодирован в одном месте, возможно, в специальном подклассе Window для удобства использования. У кого-нибудь есть подсказки о том, как начать работу или предыдущий опыт с подобными проблемами?
Ответы
Ответ 1
Вы можете создать новый ControlTemplate, который нацелен на окно, чтобы выполнить это, как показано ниже.
<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0.93*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.21*"/>
<ColumnDefinition Width="0.79*"/>
</Grid.ColumnDefinitions>
<ContentPresenter
Grid.ColumnSpan="2"
Grid.Row="1"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
/>
<ResizeGrip
HorizontalAlignment="Right"
x:Name="WindowResizeGrip"
VerticalAlignment="Bottom"
IsTabStop="False"
Visibility="Collapsed"
Grid.Column="1"
Grid.Row="2"
/>
<TextBlock Text="My Logo" />
<TextBlock Grid.Column="1" Text="My Title"/>
<StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
<Condition Property="WindowState" Value="Normal"/>
</MultiTrigger.Conditions>
<Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Ответ 2
Если вы достаточно храбры, чтобы провести большой архитектурный сдвиг, вы можете рассмотреть CompositeWPF (ранее под кодовым названием Prism) из паттернов и практик ребята из Microsoft.
Вам интереснее было бы определить "области" в оболочке (то есть окно), а затем использовать представления для заполнения регионов. Он использует шаблон Model-View-Presenter, чтобы позволить независимую разработку "представлений" из модели, чем можно легко перемещать с течением времени, поскольку оболочка определяет области и не связана непосредственно с тем, что ей помещается. В основном это помогает отделить оболочку от взглядов и взглядов друг от друга и облегчить модульное тестирование... blah, blah blah.
Это большой прыжок и что-то, что начнет замедляться, хотя ваша ситуация является одним из типов приложений, которые CompositeWPF предназначен для решения.
В составе CompositeWPF вам нужно будет взять на борт различные шаблоны, которые могут запутать новичков, например. UnityContainer, инверсия управления, MVP (или модель/представление/представление-модель) и инъекции зависимостей.
Я помню, когда я впервые начал с примера приложений, которые были озадачены, потому что не очевидно, как на самом деле некоторые из просмотров были даже созданы! Контейнер единства будет создавать объекты и называть параметризованные конструкторы магическим способом.
CompositeWPF - это изящное решение вашего вопроса, но не простое и простое. Используя CompositeWPF в моем последнем проекте, я намерен использовать его снова для следующего соответствующего приложения.
Ответ 3
Самый простой подход - создать WPF "Страница" для элементов управления, специфичных для окна, и поместить "Рам" в главное окно. Вы даже можете создать хорошую навигацию таким образом.
Ответ 4
почему именно вы используете "много окон"? Почему не просто одно окно с элементом управления вкладкой? Или одно окно с пользовательскими элементами управления?
Независимо от того, чтобы ответить на ваш вопрос, usercontrols - это один из способов, которым вы хотите получить функциональность, которую вы описываете как желающую.
Создайте новый класс Window и у него есть свойство "Childrens", которое позволяет объекту встраиваться в панель док-станции, где вы хотите, чтобы "специальные элементы окна" могли идти.
Когда вы запускаете новые окна, создавайте экземпляр типа окна и пользовательский элемент управления с определенными элементами управления, добавьте элемент управления пользователя в свойство "Дети" вашего окна, а затем покажите это окно. Вы даже можете связать обработчики событий, DataContexts и то, что не было в это время.