2009-02-19 21 views
5

¿Cómo crearía un aspecto de ventana común en WPF? No estoy hablando simplemente de diseñar la ventana, me refiero a tener una ventana que tiene un borde, una grilla y algunas otras cosas en ella.Creación de un aspecto de ventana común en WPF

Gracias.

+0

puede explicar un poco más .. desea una ventana con contenido predefinido ... como páginas maestras en ASP? ¿O estoy en el camino equivocado? – Gishu

Respuesta

0

Lo que terminé haciendo fue crear una clase base que creara el código de UI que quería en cada ventana. Esto me permite establecer eventos para los controles y tener la suscripción al evento en la clase base. Si hay una forma mejor de hacerlo, como usar xaml, me gustaría saberlo.

public WindowBase() 
{ 
    Initialized += WindowBase_Initialized; 
} 

private void WindowBase_Initialized(object sender, EventArgs e) 
{ 
    Border border = new Border(); 
    border.SetResourceReference(Control.StyleProperty, "WindowBorder"); 

    border.Child = new ContentPresenter { Content = this.Content}; 

    this.Content = border; 
} 
5

Puede crear un ControlTemplate para la ventana. Aquí hay un ejemplo bastante básico que tiene algunos controles y factores desencadenantes. Puede agregar fácilmente más elementos para que se ajuste a sus necesidades.

<ControlTemplate x:Key="MyWindowTemplate" TargetType="{x:Type Window}"> 
     <Border x:Name="WindowBorder" Style="{DynamicResource WindowBorderStyle}"> 
     <Grid> 
      <Border Margin="4,4,4,4" Padding="0,0,0,0" x:Name="MarginBorder"> 
       <AdornerDecorator> 
        <ContentPresenter/> 
       </AdornerDecorator> 
      </Border> 
      <ResizeGrip Visibility="Collapsed" IsTabStop="false" HorizontalAlignment="Right" x:Name="WindowResizeGrip" 
        VerticalAlignment="Bottom" /> 
     </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"/> 
      <Setter Property="Margin" TargetName="MarginBorder" Value="4,4,4,20" /> 
     </MultiTrigger> 
     <Trigger Property="WindowState" Value="Maximized"> 
      <Setter Property="CornerRadius" TargetName="WindowBorder" Value="0,0,0,0"/> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

Puede utilizar esta ControlTemplate estableciendo la propiedad plantilla de la Ventana:

Template="{StaticResource MyWindowTemplate}" 

Usted tendrá que usar esto en conjunto con un estilo como este:

<Style x:Key="MyWindowStyle" TargetType="{x:Type Window}"> 
     <Setter Property="AllowsTransparency" Value="False" /> 
     <Setter Property="WindowStyle" Value="SingleBorderWindow" /> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="ShowInTaskbar" Value="False" /> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Window}"> 
       <Border> 
        <AdornerDecorator> 
        <ContentPresenter/> 
        </AdornerDecorator> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 

Y establece el estilo en tu ventana de esta manera:

Style="{StaticResource MyWindowStyle}" 
+0

Esto funciona genial. El único problema que tengo ahora es que tengo algunos eventos en el código ControlTemplate. Si quiero que todas las ventanas usen la plantilla, entonces necesito poner el recurso en un archivo diferente. Cuando hago eso, los eventos ya no funcionan. –