Подтвердить что ты не робот

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

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

  • Главное окно
  • Логотип в верхнем углу
  • Заголовочный блок
  • Индикатор состояния внизу
  • Область для элементов управления, специфичных для окна.

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

4b9b3361

Ответ 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 и то, что не было в это время.