WPF - 如何在每个屏幕上显示文本

时间:2010-10-06 17:48:42

标签: c# wpf styles

我这样定义了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 个答案:

答案 0 :(得分:2)

如何制作窗口的基类,您可以在其中定义用于显示徽标和文本框的样式,使用数据绑定标题。然后从基本窗口扩展应用程序中的每个其他窗口。

答案 1 :(得分:2)

您可以在FlowWindow类上定义自定义依赖项属性,可以在样式设置器中设置。例如,如果您创建了一个名为“LogoImage”的LogoImageProperty,您可以像这样从XAML绑定它:

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

    text etc etc...
</Canvas>

这告诉FlowWindow将自己用作绑定上下文而不是DataContext,但仅用于该特定绑定。


更新:

由于您的FlowWindow只是一个逻辑包装器(并且没有任何可视内容),您可能会考虑其他一些可能性:

  1. 使用标准布局/样式为所有窗口重复使用单个自定义Window类,并将当前窗口内容放在UserControls中。现在,您可以通过标准窗口上的ContentPresenter和DataTemplate托管特定的UserControl。如果您遵循MVVM模式并且可以简单地传递视图模型以供Window可视化,那么这种方法尤其有用。

  2. 您可以使用您所使用的布局为Window创建新的ControlTemplate。有关详细信息,请参阅this answer

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

}