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

And*_*ech 8 wpf xaml styles

我正在设置App.xaml类似Window的样式:

<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>
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么?

Qui*_*son 20

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

在app.xaml/resources ..

<Style x:Key="MyWindowStyle" TargetType="Window">
    <Setter Property="WindowStyle" Value="None"></Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

然后在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}">
Run Code Online (Sandbox Code Playgroud)

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

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

如果提供TargetType,则该类型的所有实例都将应用样式.然而,衍生类型不会......似乎.<Style TargetType ="{x:Type Window}">将不适用于所有自定义派生/窗口.<Style TargetType ="{x:Type local:MyWindow}">将仅适用于MyWindow.所以选项是

使用您指定的键控样式作为要应用样式的每个窗口的样式属性.设计师将展示风格的窗户.

问题:如何在app.xaml中设置默认的WPF窗口样式?

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


And*_*lov 8

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

这是在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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