Как сделать окно шаблона в WPF?

Итак, я создаю приложение, которое будет иметь много окон с одинаковым базовым макетом:

  1. Главное окно
  2. Логотип в верхнем углу
  3. Блок заголовка
  4. Дисплей состояния внизу
  5. Область для оконных элементов управления.

На данный момент я должен воссоздать эту структуру в каждом окне. В идеале я хочу, чтобы этот макет был закодирован в одном месте, возможно, в пользовательский подкласс 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 и что не в настоящее время.

Другие вопросы по тегам