2009-01-07 15 views
18

Así que estoy construyendo una aplicación que tendrá un montón de ventanas, todas con el mismo diseño básico:¿Cómo hacer una ventana de plantilla en WPF?

  1. una ventana principal
  2. Un logotipo en la esquina superior
  3. Un bloque de título
  4. Un visualizador de estado en la parte inferior
  5. Un área para controles específicos de ventana.

Por el momento tengo que volver a crear esta estructura en cada ventana. Idealmente, quiero que este diseño se codifique en un solo lugar, tal vez en una subclase de Windows personalizada para facilitar su uso. ¿Alguien tiene alguna pista sobre cómo comenzar o sobre la experiencia previa con problemas similares?

Respuesta

31

Puede crear una nueva plantilla de control que se dirija a una ventana para lograr esto como se muestra a continuación.

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

Gracias! eso es exactamente lo que estoy buscando! Gracias :) – NoizWaves

-3

¿por qué exactamente estás usando "muchas ventanas?" ¿Por qué no solo una ventana con un control de pestañas? ¿O una sola ventana con controles de usuario?

En cualquier caso, para responder a su pregunta, controles de usuario son una forma en que desea conseguir la funcionalidad que usted está describiendo como querer.

Crear una nueva clase de ventana, y tienen que tener una propiedad "niños", que permite que un objeto se incrustan en el panel de muelle en el que desea que los "controles específicos de las ventanas" para ir.

Como se lanza nuevas ventanas, una instancia del tipo de ventana, y un control de usuario con los controles específicos, agregar el control de usuario a la propiedad Los niños de la ventana, y luego mostrar la ventana. Incluso puede vincular manejadores de eventos, DataContexts y lo que no en este momento.

+1

¿Por qué tantos downvotes? Me parece una pregunta válida, tal vez no la respuesta ideal, pero definitivamente vale la pena considerarla para la situación correcta. – MikeKulls

+0

Porque si bien presenta una solución, realmente no responde la pregunta. Además, es un método de fuerza bruta de una solución. En realidad, lo describiría como un método de WINFORMS para resolverlo sobre un WPF (que es la respuesta seleccionada). –

+0

¿Quizás se está enfocando demasiado en el bit de "ventana única con control de pestañas"? La ventana individual con controles de usuario intercambiables es una solución perfectamente válida en la situación correcta. Es la única solución que evita la duplicación de código, si tiene más de 1 ventana, entonces el código de algún tipo, sin importar cuán pequeño, deba duplicarse en cada una de esas ventanas. Si se requieren cambios, entonces ese código debe cambiarse en varias ubicaciones. No es un factor decisivo de ninguna manera, pero es algo que vale la pena considerar. – MikeKulls

6

Si eres lo suficientemente valiente como para asumir un gran cambio arquitectónico, podrías considerar CompositeWPF (anteriormente denominado Prisma) de los Patrones & Practices guys en Microsoft.

De interés para los que sería la capacidad para definir "regiones" en una cáscara (es decir, ventana) y luego el uso de vistas para llenar las regiones. Utiliza el patrón Model-View-Presenter para permitir el desarrollo independiente de "vistas" del modelo que pueden reubicarse fácilmente a lo largo del tiempo, ya que el shell solo define regiones y no está acoplado directamente a lo que se le coloca. Principalmente, esto ayuda a desacoplar el caparazón de las vistas y las vistas entre sí y facilita la prueba de la unidad ... bla, bla, bla.

Es un gran salto y algo que le hará perder tiempo, para empezar, aunque su situación es uno de los tipos de aplicaciones que CompositeWPF está destinado a abordar.

Como parte de CompositeWPF tendrá que tomar a bordo de varios patrones que pueden confundir a los recién llegados, por ejemplo UnityContainer, inversión de control, MVP (o modelo/vista/modelo de vista) e inyección de dependencia.

puedo recordar cuando empecé con las aplicaciones muestra que se está desconcertado porque no es obvio cómo en la tierra algunas de las vistas eran incluso ser creado! El contenedor de unidad instanciará objetos y llamará mágicamente a constructores parametrizados.

CompositeWPF es una solución elegante para su pregunta, pero no es simple ni directa. Habiendo utilizado CompositeWPF en mi último proyecto, tengo la intención de usarlo nuevamente para la próxima aplicación adecuada.

+0

Gracias por su introducción detallada a CompositeWPF. Descargué la Guía de aplicaciones compuestas para WPF y me confundí más, me preguntaba si hay algún ejemplo simple para que un nuevo visitante aprenda. – Picflight

+0

@Picflight: Aquí hay un enlace a un artículo de Brian Noyes sobre DevX http://www.devx.com/codemag/Article/40165/1763. Siempre que pueda obtener un código de muestra, use el depurador para ayudarlo a aprender cómo funcionan las cosas. Coloque puntos de interrupción en los constructores de las clases y suba la pila de llamadas para ver cómo funciona. – Rhys

2

El enfoque más simple es crear WPF una "Página" para los controles específicos de ventana y colocar un "Marco" en la ventana principal. Incluso puedes crear una buena navegación de esta manera.

Cuestiones relacionadas