2011-08-04 4 views
5

간단한 창 :App.xaml에서 Grid.Margin이 설정된 경우 TextBox에서 패딩이 발생하는 이유는 무엇입니까?

<Window x:Class="MyApp.MainWindow" xmlns="..." xmlns:x="..."> 

<Window.Resources> 
    <Style TargetType="Grid"> 
     <Setter Property="Margin" Value="8"/> 
    </Style> 
</Window.Resources> 

<Grid> 
    <TextBox VerticalAlignment="Top" HorizontalAlignment="Left">Test</TextBox> 
</Grid> 

</Window> 

은 다음과 같습니다

이제 우리는 Window.Resources 제거 :

<Window x:Class="MyApp.MainWindow" xmlns="..." xmlns:x="..."> 
<Grid> 
    <TextBox VerticalAlignment="Top" HorizontalAlignment="Left">Test</TextBox> 
</Grid> 
</Window> 

을 그리고 App.xaml에 스타일 정의를 추가 :

이유 :

<Application x:Class="MyApp.App" xmlns="..." xmlns:x="..." StartupUri="View\MainWindow.xaml"> 
<Application.Resources> 
    <Style TargetType="Grid"> 
     <Setter Property="Margin" Value="8"/> 
    </Style> 
</Application.Resources> 
</Application> 

이상하게도, 텍스트 상자는 이제 패딩을 얻는다?

답변

5

컨트롤 (예 : Grid)에서 파생되지 않는 요소의 암시 적 스타일은 응용 프로그램 리소스에 배치 될 때 해당 컨트롤의 모든 인스턴스에 적용됩니다. 그러나 스타일이 다른 곳에 배치되면 특정 인스턴스에는 적용되지 않습니다.

효과적으로 Style에서 응용 프로그램 리소스가 정의되어 있지 않으면 ControlTemplate 내의 요소는 해당 형식의 암시 적 스타일을 제외하고 있습니다.

그리드가 컨트롤이 아니기 때문에 (즉, 컨트롤에서 파생되지 않음) 응용 프로그램 리소스에 스타일을 배치하면 응용 프로그램의 모든 그리드에 영향을 미칩니다. 여기에는 TextBox와 같은 컨트롤의 ControlTemplate에 정의 된 그리드가 포함됩니다.

자세한 내용은 here입니다.

+0

+1 너무 나쁘다고 나는 이것을 실현하지 못했습니다. – loxxy

+0

@loxxy - 그래, 아직 미묘한 뉘앙스에 대한 문서를 찾지 못했습니다. – CodeNaked

+0

음, 고마워요! 그래서 이것을 피하는 가장 좋은 방법은 무엇입니까? 사전을 별도의 파일에 넣으시겠습니까? Grid 및 Panel에 대한 스타일을 설정하지 마십시오. –

1

내부 콘텐츠를 배치하는 동안 텍스트 상자의 기본 콘텐츠에 눈금이 포함되어 있다고 가정합니다. 응용 프로그램 리소스에서 텍스트 상자 스타일이 발생하면 그리드 스타일 또한 텍스트 상자 내부의 그리드에 적용됩니다.

그러나 같은 그리드 스타일는 윈도우 자원에 적용되는 경우 (즉 글로벌 스타일이 발생한 후)는 텍스트 상자 내부의 그리드에 영향을주지 않습니다.

관련 문제