9

我正在为 Window 设置样式,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>

我基本上希望每个窗口都将其 WindowStyle 的属性值设置为无(以删除默认的窗口框架和边框);但它不起作用。

我在这里想念什么?

4

2 回答 2

22

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

在 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,则该类型的所有实例都将应用该样式。但是派生类型不会......似乎。<Style TargetType="{x:Type Window}"> 不适用于您的所有自定义派生/窗口。<Style TargetType="{x:Type local:MyWindow}"> 将仅适用于 MyWindow。所以选项是

使用您指定为要应用该样式的每个窗口的 Style 属性的键控样式。设计器将显示样式化的窗口。

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

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

于 2009-03-26T02:06:53.133 回答
9

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

这是在 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 样式应该适用于所有窗口。

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

于 2012-10-02T10:15:58.353 回答