Как сделать окно шаблона в WPF?
Итак, я создаю приложение, которое будет иметь много окон с одинаковым базовым макетом:
- Главное окно
- Логотип в верхнем углу
- Блок заголовка
- Дисплей состояния внизу
- Область для оконных элементов управления.
На данный момент я должен воссоздать эту структуру в каждом окне. В идеале я хочу, чтобы этот макет был закодирован в одном месте, возможно, в пользовательский подкласс Window для простоты использования. У кого-нибудь есть какие-либо подсказки о том, как начать, или предыдущий опыт с подобными проблемами?
4 ответа
Вы можете создать новый шаблон 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>
Если вы достаточно смелы, чтобы сделать большой архитектурный сдвиг, вы можете рассмотреть CompositeWPF (ранее кодовое название Prism) от ребят из Patterns & Practices в Microsoft.
Для вас будет интересна возможность определять "регионы" в оболочке (т.е. в окне), а затем использовать представления для заполнения областей. Он использует шаблон Model-View-Presenter, чтобы позволить независимую разработку "представлений" из модели, которые могут быть легко перемещены с течением времени, так как оболочка определяет только области и не связана непосредственно с тем, что в ней размещено. В принципе, это помогает отделить оболочку от представлений и представлений друг от друга и облегчить юнит-тестирование... бла, бла-бла.
Это большой скачок и что-то, что замедлит вас с самого начала, хотя ваша ситуация является одним из типов приложений, которые CompositeWPF предназначен для решения.
В рамках CompositeWPF вам нужно будет использовать различные шаблоны, которые могут запутать новичков, например, UnityContainer, инверсия управления, MVP (или модель / представление / представление-модель) и внедрение зависимостей.
Я помню, когда я только начинал с примеров приложений, которые были озадачены, потому что не очевидно, как на самом деле некоторые виды создавались! Контейнер Unity будет создавать объекты и магически вызывать параметризованные конструкторы.
CompositeWPF - это элегантное решение вашего вопроса, но не простое и не простое. Используя CompositeWPF в моем последнем проекте, я намереваюсь использовать его снова для следующего соответствующего приложения.
Самый простой подход заключается в создании WPF "Страницы" для элементов управления, специфичных для окна, и размещении "Рамки" в главном окне. Вы даже можете создать красивую навигацию таким образом.
Почему именно вы используете "много окон"? Почему не просто одно окно с вкладкой? Или одно окно с пользовательскими элементами управления?
Независимо от того, чтобы ответить на ваш вопрос, пользовательский контроль - это единственный способ получить функциональность, которую вы описываете как нужную.
Создайте новый класс Window, и у него есть свойство "Дети", которое позволяет встраивать объект в панель закрепления, в которую нужно поместить "элементы управления, специфичные для окна".
При запуске новых окон создайте экземпляр типа окна и пользовательский элемент управления с конкретными элементами управления, добавьте пользовательский элемент управления в свойство Children вашего окна и затем откройте окно. Вы даже можете связать обработчики событий, DataContexts и что не в настоящее время.