2009-03-26 3 views
7

나는 등 같은 App.xaml에 윈도우의 스타일을 설정하고 있습니다 :WPF의 윈도우 컨트롤에 스타일을 적용하려면 어떻게해야합니까?

<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의 속성 값이 없음 (기본 창 프레임과 테두리를 제거하기 위해)로 설정하도록; 하지만 작동하지 않습니다.

무엇이 여기에 있습니까?

답변

19

나는 .. 그런 다음 window.xaml에서

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

당신이 app.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으로 스타일을 적용해야한다.

편집 :
당신이은 TargetType을 제공하면 창 요소에 기본 스타일을 적용과 관련하여 몇 가지 정보가 ...

, 해당 유형의 모든 인스턴스가 스타일을 적용해야합니다 발견. 그러나 파생 된 유형 ... 것 같습니다. < 스타일 TargetType = "{x : 유형 창}">> 유도/창에 대해 이 작동하지 않습니다. < 스타일 TargetType = "{x : 유형 로컬 : MyWindow}"> 은 MyWindow에만 적용됩니다. 따라서 옵션은

스타일을 적용하려는 모든 창의 스타일 속성으로 지정하는 키 스타일을 사용하십시오. 디자이너 은 스타일이 지정된 창을 표시합니다. 질문에서

는 : How to set default WPF Window Style in app.xaml?

는 질문에 대답하는 사람은 적용된 스타일이있는 기본 창에서 상속에 대한 흥미로운 생각을했다.

+0

통찰력에 감사드립니다. –

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. 그래,이게 가장 깨끗하고 빠른 방법이 아니라는 걸 알지만 작동한다. :)