WPF - Как отображать текст на каждом экране - PullRequest
0 голосов
/ 06 октября 2010

У меня стиль окна 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 просто выводится из Window с несколькими дополнительными битами):

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

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

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

Заранее спасибо!

РЕДАКТИРОВАТЬ: 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)
    {
        ...
    }
}

Ответы [ 3 ]

2 голосов
/ 07 октября 2010

Вы можете определить пользовательские свойства зависимостей в вашем классе 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. Вы можете создать новый шаблон ControlTemplate для окна с макетом, который вам нужен. См. этот ответ для получения более подробной информации.

2 голосов
/ 06 октября 2010

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

1 голос
/ 06 октября 2010

Одна возможность - добавить что-то в конструктор вашего 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

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...