Как сделать окно шаблона в WPF? - PullRequest
18 голосов
/ 07 января 2009

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

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

В данный момент я должен воссоздать эту структуру в каждом окне. В идеале я хочу, чтобы этот макет был закодирован в одном месте, возможно, в пользовательский подкласс Window для простоты использования. У кого-нибудь есть какие-либо подсказки о том, как начать, или предыдущий опыт с подобными проблемами?

Ответы [ 4 ]

32 голосов
/ 08 января 2009

Вы можете создать новый шаблон 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>
6 голосов
/ 07 января 2009

Если вы достаточно смелы, чтобы принять большой архитектурный сдвиг, вы можете рассмотреть вопрос CompositeWPF (ранее называемый Prism) от ребят из Patterns & Practices из Microsoft.

Вас интересует возможность определения «областей» в оболочке (то есть окна), а затем использование представлений для заполнения областей. Он использует шаблон Model-View-Presenter, чтобы позволить независимую разработку «представлений» из модели, которые могут быть легко перемещены с течением времени, поскольку оболочка определяет только области и не связана напрямую с тем, что в ней размещено. В принципе, это помогает отделить оболочку от представлений и представлений друг от друга и облегчить модульное тестирование ... бла, бла-бла.

Это большой скачок, который замедлит вас с самого начала, хотя ваша ситуация относится к одному из типов приложений, для которых предназначен CompositeWPF.

В рамках CompositeWPF вам нужно будет использовать различные шаблоны, которые могут запутать новичков, например, UnityContainer, инверсия управления, MVP (или модель / представление / представление-модель) и внедрение зависимостей.

Я помню, когда я только начинал с примеров приложений, которые были озадачены, потому что не очевидно, как на самом деле некоторые виды даже создавались! Контейнер Unity будет создавать объекты и магически вызывать параметризованные конструкторы.

CompositeWPF - это элегантное решение вашего вопроса, но не простое и не простое. Используя CompositeWPF в моем последнем проекте, я намереваюсь использовать его снова для следующего соответствующего приложения.

2 голосов
/ 07 января 2009

Самый простой подход - создать WPF «Страницу» для элементов управления окна и поместить «Рамку» в главное окно. Вы даже можете создать красивую навигацию таким образом.

0 голосов
/ 07 января 2009

почему именно вы используете "много окон"? Почему бы не просто одно окно с вкладкой? Или одно окно с пользовательскими элементами управления?

Независимо от того, чтобы ответить на ваш вопрос, пользовательский контроль - это один из способов получить функциональность, которую вы описываете как нужную.

Создайте новый класс Window, и у него есть свойство «Дети», которое позволяет встраивать объект в панель закрепления, куда вы хотите добавить «элементы управления окнами».

Когда вы запускаете новые окна, создаете экземпляр типа окна и пользовательский элемент управления с конкретными элементами управления, добавьте пользовательский элемент управления в свойство Children вашего окна и затем откройте окно. Вы даже можете связать обработчики событий, DataContexts и то, чего нет в это время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...