2013-03-22 9 views
17

내 응용 프로그램에서 사용자 지정 테마를 사용하고 싶습니다. App.xaml에서 리소스 사전을 참조하여이 작업을 수행 할 수 있습니다. 스타일은 다음과 같이 기본값을 무시할 것 :WPF 스타일을 오버라이드하는 대신 확장하는 방법

<Style TargetType="{x:Type Label"> 
    <Setter Property="Foreground" Value="Green" /> 
</Style> 

을 지금은 기본 레이블 스타일을 같은 값으로 오버라이드 (override)되어 있지만 내 모든 레이블 글꼴이 녹색으로 생각한다. 문제는 한 라벨을 다른 스타일로 다시 스타일링하려는 경우부터 시작됩니다. 내가 그들의 전경색을 잃고 내 그리드 내부에이

<Grid.Resources> 
    <Style TargetType="{x:Type Label"> 
     <Setter Property="FontSize" Value="28" /> 
    </Style> 
</Grid.Resources> 

모든 라벨처럼 내 그리드에 다른 속성을 변경하려면 다시 기본 일이있을 때 (나는 이전 단계에서 기본값을 무시하지 않았다?). 어떤 시도가 끝나면 이것을 올바르게 수행하기 위해 다른 속성을 Style 선언 BasedOn={StaticResource {x:Type Label}}"에 추가해야한다는 것을 알았습니다. 이제는 전체 앱에서 동일한 BasedOn 코드를 반복해야하므로 스타일이 작동하는 방식이 아니므로 나에게 이상하다고 할 수 있습니다. 자동으로 수행해야합니다. 예를 들어 HTML + CSS 스타일은 상속되고 병합되며 WPF에서는 대체됩니다. ...

스타일 컨트롤을 사용하지 않을 때 somehwere (System Themes?)에서 여전히 모양이 나타납니다. 다른 곳에서 기본값을 찾기 위해 스타일에 대한 추가 코드없이 기본값이 초록색이어야한다고 생각할 수있는 방법은 무엇입니까?

BasedOn 속성을 설정할 수있는 방법이 있습니까? 아니면 이것을 지나치게하는 것이 더 좋은가?

+0

는 난 그냥 문제를 다시 읽어 여기 http://stackoverflow.com/questions/2377055/override-overriden-wpf-theme 대답 – labm0nkey

+0

와 similliar 질문을 발견, 당신이 사용하는 경우 궁금 해서요 리소스 사전? 스타일을 정의 할 수 있고 그 스타일을 xaml 요소에 적용하기를 원한 것 같습니다. 맞습니까? 음, 리소스 사전을 설정하면 모든 레이블이 녹색 전경을 갖도록 설정 한 기본 스타일을 가질 수 있습니다. 그런 다음 글꼴 크기를 설정하는 다른 스타일을 기반으로합니다.이 스타일은 모두 글꼴로 사용되는 코드 파일에 들어 있습니다. 사전. 그런 다음 각 xaml 요소에서 스타일을 'Style = "{StaticResource LargeGreen}"'또는 다른 이름으로 지정합니다. 나는 내 대답을 예를 들어 편집하려고 노력할 것이다. – Zack

답변

20

나는 동일한 문제가있었습니다. 나는 Zack의 대답을 사용했고 다음과 같이 개선했다. 따라서 스타일을 지정하지 않으면 재정의 된 기본값이 여전히 고려되었다. 그것은 기본적으로 당신이 한 것이지만 ResourceDictionary에서 단 한 번입니다.

<Window x:Class="TestWpf.RandomStuffWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Random Stuff Window"> 
    <Window.Resources> 
    <ResourceDictionary> 
     <!-- Default Label style definition --> 
     <Style TargetType="{x:Type Label}"> 
     <Setter Property="Foreground" Value="Green" /> 
     </Style> 
     <!-- Extending default style --> 
     <Style TargetType="{x:Type Label}" 
      x:Key="LargeGreenForegroundLabel" 
      BasedOn="{StaticResource {x:Type Label}}"> 
     <Setter Property="FontSize" Value="28" /> 
     </Style> 
    </ResourceDictionary> 
    </Window.Resources> 
    <StackPanel> 
    <Button Click="Button_Click">Click</Button> 
    <Label Content="GreenForegroundLabel" /> <!-- Uses default style --> 
    <Label Style="{StaticResource LargeGreenForegroundLabel}" 
      Content="LargeGreenForegroundLabel" /> 
    </StackPanel> 
</Window> 
8

Wpf는 스타일이 다르며 global> local 순서로 적용됩니다. 컨트롤에 직접 설정된 스타일은 예제와 같이 전역으로 설정된 스타일보다 우선합니다. 컨트롤이 스타일을 찾는 모든 다른 장소의 목록을 찾으려고했지만 지금은 찾을 수 없습니다. 내가 아는 한, BasedOn 속성을 사용하여 스타일을 상속하고 해당 스타일의 속성을 로컬로 설정 한 스타일로 완전히 재정의하지 않아야합니다.

다음은 다른 스타일을 기반으로하는 스타일을 가진 리소스 사전의 예입니다. 따라서 BasedOn 바인딩을 반복해서 반복하지 않아도되므로 원하는 특정 요소에 스타일을 설정할 수 있습니다 그 스타일.

<Window x:Class="TestWpf.RandomStuffWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Random Stuff Window"> 
    <Window.Resources> 
    <ResourceDictionary> 
     <Style TargetType="{x:Type Label}" 
      x:Key="GreenForegroundLabel"> 
     <Setter Property="Foreground" Value="Green" /> 
     </Style> 
     <Style TargetType="{x:Type Label}" 
      x:Key="LargeGreenForegroundLabel" 
      BasedOn="{StaticResource GreenForegroundLabel}"> 
     <Setter Property="FontSize" Value="28" /> 
     </Style> 
    </ResourceDictionary> 
    </Window.Resources> 
    <StackPanel> 
    <Button Click="Button_Click">Click</Button> 
    <Label Style="{StaticResource GreenForegroundLabel}" 
      Content="GreenForegroundLabel" /> 
    <Label Style="{StaticResource LargeGreenForegroundLabel}" 
      Content="LargeGreenForegroundLabel" /> 
    </StackPanel> 
</Window>