我这样定义了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)
{
...
}
}
答案 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只是一个逻辑包装器(并且没有任何可视内容),您可能会考虑其他一些可能性:
使用标准布局/样式为所有窗口重复使用单个自定义Window类,并将当前窗口内容放在UserControls中。现在,您可以通过标准窗口上的ContentPresenter和DataTemplate托管特定的UserControl。如果您遵循MVVM模式并且可以简单地传递视图模型以供Window可视化,那么这种方法尤其有用。
您可以使用您所使用的布局为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
}