Pergunta

Então, estou construindo um aplicativo que terá muitas janelas, tudo com o mesmo layout básico:

  1. Uma janela principal
  2. Um logotipo no canto superior
  3. Um bloco de título
  4. Um exibidor de status no fundo
  5. Uma área para controles específicos da janela.

No momento, tenho que recriar essa estrutura em todas as janelas. Idealmente, quero que este layout seja codificado em um único local, talvez em uma subclasse de janela personalizada para facilitar o uso. Alguém tem alguma pista sobre como começar ou experiência anterior com problemas semelhantes?

Foi útil?

Solução

Você pode criar um novo ControlTemplate que visa uma janela para conseguir isso como mostrado abaixo.

<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>

Outras dicas

Se você é corajoso o suficiente para fazer uma grande mudança arquitetônica, você pode considerar Compositewpf (anteriormente codinome Prism) dos caras dos padrões e práticas da Microsoft.

De interesse de você seria a capacidade de definir "regiões" em uma concha (ou seja, janela) e, em seguida, usando as visualizações para preencher as regiões. Ele usa o padrão do apresentador de modelo-visualização para permitir o desenvolvimento independente de "visualizações" do modelo do que pode ser facilmente realocado ao longo do tempo, pois o shell define apenas regiões e não é acoplado diretamente ao que é colocado nele. Principalmente, isso ajuda a dissociar a concha das vistas e as vistas uma da outra e facilitar o teste unitário ... blá, blá blá.

É um grande salto e algo que o atrasará para começar, embora sua situação seja um dos tipos de aplicativos que o CompositeWPF deve abordar.

Como parte do CompositeWPF, você precisará aceitar vários padrões que podem confundir os recém-chegados, por exemplo, o UnityContainer, a inversão de controle, MVP (ou modelo/view/view-model) e injeção de dependência.

Lembro -me de quando comecei com os aplicativos de amostra sendo intrigados, porque não é óbvio como diabos algumas das vistas estavam sendo criadas! O contêiner do Unity instanciará objetos e chama construtores parametrizados magicamente.

O CompositeWPF é uma solução elegante para sua pergunta, mas não simples ou direta. Tendo usado o CompositeWPF no meu último projeto, pretendo usá -lo novamente para o próximo aplicativo apropriado.

A abordagem mais simples é criar o WPF A "página" para os controles específicos da janela e colocar um "quadro" na janela principal. Você pode até criar uma boa navegação dessa maneira.

Por que exatamente você está usando "muitas janelas?" Por que não apenas uma única janela com um controle de guia? Ou uma única janela com controles do usuário?

Independentemente disso, para responder à sua pergunta, o UserControls é uma maneira de obter a funcionalidade que está descrevendo como desejando.

Crie uma nova classe de janela e tenha uma propriedade "Childrens", que permite que um objeto seja incorporado no painel Dock, onde deseja que os "controles específicos da janela".

Ao iniciar o novo Windows, instanciam o tipo de janela e um controle do usuário com os controles específicos, adicione o controle do usuário à propriedade Children da sua janela e mostre a janela. Você pode até vincular manipuladores de eventos, DataContexts e o que não está no momento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top