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