Вопрос

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top