2010-10-06 1 views
0

я стиль WPF окна определяется таким образом:WPF - Как для отображения текста на каждом экране

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

Мое приложение затем определяет несколько экранов, используя этот стиль (FlowWindow просто выводится из окна с несколькими дополнительными битами) :

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

Мой вопрос - Как определить текстовый блок, который будет отображаться в каждом окне, использующем этот стиль? Например, если я хочу, чтобы логотип отображался в верхнем правом углу каждого экрана ...

Поскольку стиль определяет такие вещи, как размер и шрифт, а не содержимое холста, я не уверен, как это сделать это.

Заранее благодарен!

EDIT: FlowWindow не является UserControl. Это просто часть моего пространства имен KaleidoscopeApplication.Controls. Он определяется как:

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

Каковы «дополнительные биты», которые составляют FlowWindow? Действительно ли это пользовательский элемент управления (как следует из вашего префикса), или это фактически настраиваемый элемент управления с ассоциированным файлом generic.xaml? –

+0

Добавлена ​​некоторая информация о FlowWindow ... – BabaBooey

ответ

2

Вы можете определить пользовательские свойства зависимостей от класса FlowWindow, который может быть установлен в Стиль сеттеров. Например, если вы создали LogoImageProperty под названием «LogoImage», можно привязать к нему с XAML, как это:

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

    text etc etc... 
</Canvas> 

Это говорит FlowWindow использовать себя в качестве обязательного контекста, а не DataContext, но только для это конкретное обязательство.


UPDATE:

Поскольку ваша FlowWindow просто логическая обертка (и не имеет никакого визуального контента), вы могли бы рассмотреть некоторые другие возможности:

  1. повторно использовать отдельный пользовательский класс Window для всех ваших окон с вашим стандартным макетом/стилем и размещайте содержимое текущего окна внутри UserControls. Теперь вы можете разместить определенный UserControl через ContentPresenter и DataTemplate в стандартном окне. Это работает особенно хорошо, если вы следуете шаблону MVVM и можете просто передать модель представления, которая будет отображаться вашим окном.

  2. Вы можете создать новый контрольный шаблон для окна с макетом, который вы используете. См. this answer для более подробной информации.

+0

Дело в том, что XAML-файл отсутствует с классом FlowWindow.Файл XAML, показанный в моем примере, соответствует одному экрану с именем DisposablesScan. – BabaBooey

+0

А, я вижу. Я предлагаю альтернативное решение, которое немного изменяет дизайн, но может быть полезно. –

2

Как о создании базового класса окна, где вы можете определить стиль для отображения логотипа и текстового поля, заголовок с помощью привязки данных. Затем проведите каждое окно в своем приложении из базового окна.

1

Одна из возможностей - добавить что-то в конструктор вашего FlowWindow. Трудно дать полный пример здесь, потому что я не знаю, ваш точный дизайн, но вот некоторые псевдо-код:

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 

} 
Смежные вопросы