2010-10-06 52 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> 

我的問題 - 如何定義,將在使用這種風格的每個窗口顯示的文本塊?例如,如果我想要在每個屏幕的右上角顯示徽標...

由於樣式定義了大小和字體等內容,而不是畫布的內容,所以我不確定如何去這個。

在此先感謝!

編輯: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文件? – 2010-10-06 18:59:28

+0

添加了一些關於FlowWindow的信息... – BabaBooey 2010-10-06 19:10:51

回答

2

您可以在FlowWindow類,它可以在設置中定義自定義依賴屬性樣式安裝程序。例如,如果你創建了一個名爲「LogoImage」 LogoImageProperty,你可以從XAML綁定到它是這樣的:

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

    text etc etc... 
</Canvas> 

這告訴FlowWindow使用本身作爲結合語境,而不是DataContext的,但僅限於特定的約束力。


UPDATE:

由於您的FlowWindow只是一個邏輯包裝(並且沒有任何可視內容),你可能會考慮一些其他的可能性:

  1. 重新使用使用標準佈局/樣式爲所有窗口單獨定製Window類,並將當前窗口內容放入UserControls中。現在,您可以通過標準窗口上的ContentPresenter和DataTemplate託管特定的UserControl。如果您遵循MVVM模式,並且可以簡單地傳遞視圖模型以便通過Window對其進行可視化,則此功能尤其適用。

  2. 您可以使用您之後的佈局爲窗口創建一個新的ControlTemplate。有關更多詳細信息,請參閱this answer

+0

事情是,沒有XAML文件與FlowWindow類一起使用。我的示例中顯示的XAML文件對應於稱爲DisposablesScan的單個屏幕。 – BabaBooey 2010-10-06 21:44:30

+0

啊,我明白了。我會提出一個替代解決方案,這是一個設計轉變,但可能是有用的。 – 2010-10-06 23:29:04

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 

}