2010-10-06 4 views
0

J'ai un style de fenêtre WPF défini ainsi:WPF - Comment afficher du texte sur chaque écran

 <Style 
      x:Key="Applet" 
      TargetType="{x:Type Window}"> 
      <Setter 
       Property="WindowStyle" 
       Value="None" /> 
      <Setter 
       Property="WindowState" 
       Value="Maximized" /> 
      <Setter 
       Property="Title" 
       Value="Hindenburg" /> 
      <Setter 
       Property="FontFamily" 
       Value="Arial" /> 
      <Setter 
       Property="Height" 
       Value="650" /> 
      <Setter 
       Property="Width" 
       Value="850" /> 
     </Style> 

Mon application définit ensuite plusieurs écrans en utilisant ce style (FlowWindow est juste dérivé de la fenêtre avec quelques bits supplémentaires) :

<uControl:FlowWindow 
x:Class="KaleidoscopeApplication.DisposablesScan" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:u="clr-namespace:KaleidoscopeApplication" 
xmlns:uControl="clr-namespace:KaleidoscopeApplication.Controls" 
Style="{StaticResource Applet}" 
Loaded="disposablesScanWindow_Loaded" 
Unloaded="disposablesScanWindow_Unloaded">  

<Canvas> 
    <!-- Top Bar Background --> 
    <Image 
     Source="Resources/Elements/Backgrounds/16.png" /> 

    text etc etc... 
</Canvas> 

Ma question - Comment définir un bloc de texte qui sera affiché sur chaque fenêtre utilisant ce style? Par exemple, si je veux un logo affiché dans le coin supérieur droit de chaque écran ...

Puisque le style définit des choses comme la taille et la police et non le contenu de la toile, je ne sais pas comment s'y prendre ce.

Merci d'avance!

EDIT: FlowWindow n'est pas un UserControl. C'est juste une partie de mon espace de noms KaleidoscopeApplication.Controls. Il est défini comme:

public class FlowWindow : Window 
{  
    public FlowWindow() 
     : base() 
    { } 

    /// <summary> 
    /// Transition smoothly to another FlowWindow. 
    /// </summary> 
    /// <param name="toWindow">The window to transtion to.</param> 
    public override void Transition(FlowWindow toWindow) 
    { 
     ... 
    } 
} 
+0

Quels sont les "bits supplémentaires" qui composent le FlowWindow? Est-ce vraiment un contrôle utilisateur (comme votre préfixe l'indique), ou est-ce un contrôle personnalisé, avec un fichier generic.xaml associé? –

+0

Ajout d'informations sur FlowWindow ... – BabaBooey

Répondre

2

Vous pouvez définir sur mesure des propriétés de dépendance de votre classe FlowWindow, qui peut être réglé dans le Setters de style. Par exemple, si vous avez créé un LogoImageProperty nommé « logoimage », vous pouvez lier à lui du XAML comme ceci:

<Canvas> 
    <!-- Top Bar Background --> 
    <Image 
     Source="{Binding LogoImage, RelativeSource={RelativeSource Mode=Self}}" /> 

    text etc etc... 
</Canvas> 

Cela indique au FlowWindow de s'utiliser comme contexte de liaison plutôt que le DataContext, mais seulement pour cette liaison particulière.


MISE À JOUR:

Depuis votre FlowWindow est juste une enveloppe logique (et ne pas contenu visuel), vous pouvez envisager quelques autres possibilités:

  1. Réutiliser un classe de fenêtres personnalisée unique pour toutes vos fenêtres avec votre disposition/style standard et placez votre contenu de fenêtre en cours dans UserControls. Vous pouvez maintenant héberger le UserControl spécifique via un ContentPresenter et un DataTemplate sur la fenêtre standard. Cela fonctionne particulièrement bien si vous suivez un modèle MVVM et pouvez simplement passer dans le modèle de vue pour être visualisé par votre fenêtre.

  2. Vous pouvez créer un nouveau ControlTemplate pour la fenêtre avec la disposition souhaitée. Voir this answer pour plus de détails.

+0

En fait, il n'y a pas de fichier XAML associé à la classe FlowWindow.Le fichier XAML montré dans mon exemple correspond à un seul écran appelé DisposablesScan. – BabaBooey

+0

Ah, je vois. Je proposerai une autre solution qui est un peu un changement de conception, mais pourrait être utile. –

2

Que diriez-vous faire une classe de base de la fenêtre où vous pouvez définir le style pour montrer la zone de logo et le texte, le titre en utilisant la liaison de données. Puis étendez chaque autre fenêtre dans votre application à partir de la fenêtre de base.

1

Une possibilité est d'ajouter quelque chose dans le constructeur de votre FlowWindow. Il est difficile de donner un exemple complet ici parce que je ne connais pas votre conception exacte, mais voici quelques pseudo-code:

public FlowWindow() 
    : base() 
{ 
    Image logo = new Image(); 
    ImageSourceConverter converter = new ImageSourceConverter(); 
    string path = "pack://application:,,,/Resources/logo.png"; 
    ImageSource source = (ImageSource)converter.ConvertFromString(path); 
    logo.Source = source; 
    logo.Width = 50d; 

    // Add properties and attached properties like Canvas.LeftProperty, 
    // Canvas.TopProperty, Canvas.ZIndexProperty, etc., and then 
    // find the first child of the FlowWindow, and add the image 
    // to the Children collection of that first child 

} 
Questions connexes