2016-11-02 6 views
2

내 질문에 this post와 동일합니다. 그러나이 오래된 게시물은 4 년 동안 답변이 없기 때문에 어쩌면 이것이 정상적으로 작동하지 않는 이유에 대한 새로운 통찰력이 있을지도 모른다고 생각했습니다.왜 내 스타일이 적용되지 않습니까?

내 창 리소스에서 나는 TextBlock에 대한 간단한 스타일을 정의합니다. 스타일에는 x:Key 속성이 없으므로 내 창에서 자신의 스타일이없는 모든 TextBlock 컨트롤에 적용해야합니다.

그런 다음 GridView을보기로 정의하여 ListView을 만듭니다. ListView에는 4 개의 열이 정의되어 있고 두 개의 열은 TextBlock을 포함하는 명시적인 CellTemplate으로 정의되며 두 개의 열은 명시 적 CellTemplate없이 정의됩니다.

가 여기 내 전체 XAML 코드입니다 (문제는 코드에서 다음과) :

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication1" 
    mc:Ignorable="d" 
    Title="MainWindow" SizeToContent="WidthAndHeight"> 

<Window.Resources> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="HorizontalAlignment" Value="Stretch" /> 
     <Setter Property="TextTrimming" Value="CharacterEllipsis" /> 
     <Setter Property="Background" Value="Aqua" /> 
    </Style> 

    <Style x:Key="ListViewItemStyle" TargetType="ListViewItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
    </Style> 
</Window.Resources> 

<ListView ItemContainerStyle="{StaticResource ListViewItemStyle}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Bottom" Width="50" DisplayMemberBinding="{Binding Bottom}" /> 
      <GridViewColumn Header="Left" Width="50"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Left}" TextAlignment="Center" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Right" Width="50"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Right}" TextAlignment="Right" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Top" Width="50" DisplayMemberBinding="{Binding Top}" /> 
     </GridView> 
    </ListView.View> 
    <ListView.Items> 
     <Thickness>1,2,3,4</Thickness> 
     <Thickness>5,6,7,8</Thickness> 
     <Thickness>9,10</Thickness> 
    </ListView.Items> 
</ListView> 
</Window> 

이 코드를 실행하면, 내가 볼 수있는, 내 TextBlock 스타일은, 그 모든 TextBlock에 적용하도록되어 있음 컨트롤은 명시적인 CellTemplate이없는 열에서만 활성화됩니다.

왜 그럴까요?

내가, 내가 볼 수있는 시각적 트리를 검사

그 작업 열 열이 작동하지 않는 동안, 적용된 내 스타일로 TextBlock 만들어진 (사람 CellTemplate없이)합니다 ( 이고 CellTemplate)은 TextBlock 내부에 ContentPresenter으로 이루어져 있지만, TextBlock에는 스타일이 전혀 없습니다.

답변

2

피드백 보내기 현재 상태이 동작은 의도적으로 설계된 것입니다. This link은 무슨 일이 일어나고 있는지 설명합니다. 또한 2006 년 10 월에 Microsoft Connect에 대한 버그 보고서가있었습니다. 불행히도 주어진 링크의 버그 보고서에 대한 원래 링크는 더 이상 작동하지 않습니다.

여기 주어진 링크가 미래에 다운 될 경우를 대비해 Connect의 버그 리포트에 대한 답을 말하고 있습니다.

이 동작은 '디자인 별'이며 이는 이유입니다. 템플릿은 캡슐화 경계로 간주됩니다. 이러한 템플릿에 의해 생성 된 요소는이 경계 내에 있습니다. 일치하는 TargetType이있는 스타일을 조회하면이 경계에서 멈 춥니 다. 따라서 템플릿을 통해 생성되는 repro의 TextBlock은 해당 스타일을 선택하지 않습니다. 템플리트 외부에 정의 된 TextBlock은 않습니다. 이 문제를 해결하는 한 가지 방법은 스타일에 명시적인 이름을 지정하고 템플릿의 TextBlock에서이 이름으로 스타일을 참조하는 것입니다.

이미 문제 해결 방법을 제공하고 있습니다. 그들은 Window.ResourcesTextBlock 스타일을 지정하고 템플릿의 스타일을 참조해야한다고 말합니다.

나는이 스타일이 자동으로 DataTemplate 외부의 모든 TextBlocks에 적용되지 않기 때문에 이것이 실제로 원하는 것이 아니라고 생각합니다. 따라서 Windows.Resources에 스타일을 지정하는 대신 명시 적으로 스타일을 참조 할 때 BasedOn 속성에서 약간의 트릭을 수행 할 수 있습니다. 스타일 이름을 지정하는 대신 다음과 같은 유형을 지정합니다.

<GridViewColumn Header="Left" Width="50"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <DataTemplate.Resources> 
       <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" /> 
      </DataTemplate.Resources> 
      <TextBlock Text="{Binding Left}" TextAlignment="Center" /> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

이 방법을 사용하면 스타일 이름을 지정하지 않아도 모든 TextBlock에 스타일이 적용됩니다.

참고로 전체 Window XAML은 다음과 같습니다. 이제 GridView의 모든 열은 동일한 스타일을 사용합니다.

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication1" 
    mc:Ignorable="d" 
    Title="MainWindow" SizeToContent="WidthAndHeight"> 

    <Window.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="HorizontalAlignment" Value="Stretch" /> 
      <Setter Property="TextTrimming" Value="CharacterEllipsis" /> 
      <Setter Property="Background" Value="Aqua" /> 
     </Style> 

     <Style x:Key="ListViewItemStyle" TargetType="ListViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     </Style> 
    </Window.Resources> 

    <ListView ItemContainerStyle="{StaticResource ListViewItemStyle}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Bottom" Width="50" DisplayMemberBinding="{Binding Bottom}" /> 
       <GridViewColumn Header="Left" Width="50"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <DataTemplate.Resources> 
           <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" /> 
          </DataTemplate.Resources> 
          <TextBlock Text="{Binding Left}" TextAlignment="Center" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <GridViewColumn Header="Right" Width="50"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <DataTemplate.Resources> 
           <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" /> 
          </DataTemplate.Resources> 
          <TextBlock Text="{Binding Right}" TextAlignment="Right" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <GridViewColumn Header="Top" Width="50" DisplayMemberBinding="{Binding Top}" /> 
      </GridView> 
     </ListView.View> 
     <ListView.Items> 
      <Thickness>1,2,3,4</Thickness> 
      <Thickness>5,6,7,8</Thickness> 
      <Thickness>9,10</Thickness> 
     </ListView.Items> 
    </ListView> 
</Window> 
+0

해당 문제에 대한 귀하의 설명에 진심으로 감사드립니다. 나는'x : Key' 스타일과'TextBlock'에서 스타일 속성을 고수 할 것입니다. 그것은 더 직접적입니다. 그리고 어쨌든 나는 그것을 모든'DataTemplate'에 넣어야하기 때문에 ... – Nostromo

관련 문제