2016-11-02 2 views
2

meine Frage ist die gleiche wie in this post. Aber seit dieser alten Post seit vier Jahren keine Antwort mehr gibt, dachte ich, es gäbe vielleicht neue Einsichten darüber, warum das nicht so funktioniert, wie es sein sollte.Warum wird mein Stil nicht angewendet?

In meinen Fensterressourcen definiere ich einen einfachen Stil für eine TextBlock. Der Stil hat kein x:Key Attribut, so dass er auf alle TextBlock Steuerelemente in meinem Fenster angewendet werden soll, die keinen eigenen Stil haben.

Dann erstelle ich eine ListView mit einer GridView als seine Ansicht definiert. Die ListView hat vier Spalten definiert, zwei Spalten sind mit einer expliziten CellTemplate definiert, die eine TextBlock enthält und zwei Spalten sind ohne eine explizite CellTemplate definiert.

Hier ist meine komplette XAML-Code (die Frage folgt unter dem Code):

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

Wenn ich diesen Code ausführen, kann ich sehen, dass meine TextBlock Stil, das soll auf alle TextBlock angewendet werden Controls, ist nur in den Spalten aktiv, die keine explizite CellTemplate haben.

Warum ist das?

Wenn ich die visuelle Struktur inspizieren ich sehen kann, dass die Arbeitsspalten (die, die ohne ein CellTemplate) aus einem TextBlock mit meinem Stil angewendet gemacht, während die Säulen, die (nicht funktionieren die Ein mit ein CellTemplate) sind aus einem ContentPresenter mit einem TextBlock innen, aber der TextBlock hat keinen Stil überhaupt.

Antwort

2

Dieses Verhalten ist tatsächlich von Entwurf. This link beschreibt, was vor sich geht. Es gab auch einen Fehlerbericht über Microsoft Connect im Oktober 2006. Leider funktioniert der ursprüngliche Link zum Fehlerbericht in dem angegebenen Link nicht mehr.

Hier rezitiere ich die Antwort auf den Fehlerbericht von Connect für den Fall, dass der angegebene Link in Zukunft ausfällt.

Dieses Verhalten ist "By Design" und aus diesem Grund. Vorlagen werden als Einkapselungsgrenze betrachtet. Elemente, die von diesen Vorlagen erzeugt werden, fallen in diese Grenze. Und die Suche nach einem Stil mit einem passenden TargetType stoppt an dieser Grenze. Daher greift der TextBlock in der Repro, der durch eine Vorlage erzeugt wird, den betreffenden Stil nicht auf. Während der außerhalb der Vorlage definierte TextBlock dies tut. Eine Möglichkeit, dieses Problem zu umgehen, besteht darin, dem Stil einen expliziten Namen zu geben und den Stil anhand dieses Namens auf den TextBlock in der Vorlage zu verweisen.

Sie sehen, dass sie bereits eine Problemumgehung für Ihr Problem bereitgestellt haben. Sie geben an, dass Sie Ihrem TextBlock Stil in dem Window.Resources einen Namen geben und den Stil in der Vorlage verweisen sollen.

Ich denke, das ist nicht das, was Sie wirklich wollen, denn in diesem Fall wird der Stil nicht automatisch auf alle TextBlocks (außerhalb der DataTemplate) angewendet. Aus diesem Grund können Sie, anstatt dem Stil in Windows.Resources einen expliziten Namen zu geben, einen kleinen Trick in Ihrer BasedOn-Eigenschaft ausführen, wenn Sie auf den Stil verweisen. Anstatt den Namen des Stils anzugeben, geben Sie den Typ wie folgt an.

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

Mit diesem Ansatz haben Sie immer noch den Vorteil, dass Sie einen Namen für Stil und der Stil wird auf alle Textblocks angewendet angeben.

Als Referenz sieht das gesamte Window XAML so aus. Jetzt haben alle Spalten in GridView den gleichen Stil.

<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

Vielen Dank für Ihre Erläuterungen zu diesem Thema. Ich denke, ich bleibe bei dem 'Text: Stil' und einem Stilattribut bei 'Textblock', das direkter ist. Und da ich es sowieso in jedes 'DataTemplate' schreiben muss ... – Nostromo

Verwandte Themen