9

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 のプロパティ値を None に設定する必要があります (デフォルトのウィンドウ フレームと境界線を削除するため)。しかし、それは機能していません。

ここで何が欠けていますか?

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}">

これは機能するはずですが、リソース内の Window に TargetType を使用してスタイルを適用するだけでは、他の要素では機能するように見えますが、Window でそのスタイルを使用することは強制されません。

編集:
ウィンドウ要素にデフォルトのスタイルを適用することに関連する情報が見つかりました..

TargetType を指定すると、そのタイプのすべてのインスタンスにスタイルが適用されます。ただし、派生型はそうではありません...そうです。<Style TargetType="{x:Type Window}"> は、すべてのカスタム派生/ウィンドウでは機能しません。<Style TargetType="{x:Type local:MyWindow}"> は MyWindow のみに適用されます。したがって、オプションは

スタイルを適用するすべてのウィンドウの Style プロパティとして指定する Keyed 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 に答える