如何在WPF中将样式应用于Window Control?

时间:2009-03-26 01:41:36

标签: wpf xaml styles

我正在为App.xaml中的窗口设置样式,如下所示:

<Application x:Class="MusicRepo_Importer.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" StartupUri="TestMaster.xaml">
    <Application.Resources>

        <Style TargetType="Window">
            <Setter Property="WindowStyle" Value="None"></Setter>
        </Style>

    </Application.Resources>
</Application>

我基本上希望每个Window都将其WindowStyle的属性值设置为None(删除默认的Windows框架和边框);但它没有用。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:19)

我相信您必须将样式命名并将其应用于每个窗口,如下所示..

在app.xaml / resources ..

<Style x:Key="MyWindowStyle" TargetType="Window">
    <Setter Property="WindowStyle" Value="None"></Setter>
</Style>

然后在window.xaml ..

<Window x:Class="MusicRepo_Importer.MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MyStyledWindow" Style="{StaticResource MyWindowStyle}">

这应该可行,但只是在资源中应用具有TargetType for Window的样式将不会强制Window使用该样式,尽管它似乎适用于其他元素。

编辑:
找到一些关于将默认样式应用于窗口元素的信息..

  

如果您提供TargetType,则全部   该类型的实例将具有   风格适用。但派生类型   不会......似乎。 &LT;风格   TargetType =“{x:Type Window}”&gt;将不会   适用于所有自定义   推导/窗口。 &LT;风格   TargetType =“{x:Type local:MyWindow}”&gt;   仅适用于MyWindow。所以   选项是

     

使用您指定为的键控样式   每个窗口的Style属性   想要应用这种风格。设计师   将显示样式窗口。

来自问题:How to set default WPF Window Style in app.xaml?

回答这个问题的人对从具有应用样式的基本窗口继承有一个有趣的想法。

答案 1 :(得分:7)

我知道这个问题已经很老了,但无论如何我都会回答。

以下是适用于C#4.0的代码。 它只是复制了资源字典中所有子类的样式。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        if (this.Resources.Contains(typeof(Window)))
        {
            var types = Assembly.GetEntryAssembly().GetTypes();
            var subTypes = types.Where(x => x.IsSubclassOf(typeof(Window)));

            Style elementStyle = (Style)this.Resources[typeof(Window)];

            foreach (Type subType in subTypes)
            {
                if (!this.Resources.Contains(subType))
                {
                    this.Resources.Add(subType, elementStyle);
                }
            }
        }

        base.OnStartup(e);
    }
}

现在,App.xaml的样式应适用于所有窗口。

P.S。是的,我知道这不是最干净或最快的方式,但它有效。 :)