2016-03-30 7 views
0

Ich habe WPF-Anwendung, ich erstellte DataGrid Stil in App.xaml, um ganze Anwendung anwenden.Versuchen, mehrere Stile auf eine DataGridRow anzuwenden

App.xaml

<Style TargetType="DataGrid" x:Key="GridStyle1"> 
    <Setter Property="HorizontalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="VerticalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="AlternatingRowBackground" Value="WhiteSmoke" /> 
    <Setter Property="RowHeight" Value="30" /> 
    <Setter Property="RowStyle"> 
     <Setter.Value> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" Value="Cyan" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

Dann im Fenster:

Window1.xaml

<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
    <Setter Property="FontStyle" Value="Italic" /> 
</Style> 

Das Problem, das Fenster Stil nicht gilt (Schriftstil nicht kursiv)

+0

Wenn Sie 'GridStyle1' tatsächlich auf Ihr' DataGrid' anwenden, dann setzt dieser Stil den Stil für 'DataGridRow' in diesem' DataGrid' und der von Ihnen erstellte Standardstil wird natürlich ignoriert. Ist Ihr DataGridRow mit einem Cyan Hintergrund angezeigt? Fügen Sie dem Stil, der den Cyan-Hintergrund festlegt, das Attribut "BasedOn" hinzu. Das ist wahrscheinlich derjenige, der tatsächlich benutzt wird. Möglicherweise gibt es andere Probleme, aber versuchen Sie es zuerst. –

+0

Ich habe versucht, das gleiche BaseOn-Attribut zu Cyan Hintergrund hinzufügen, aber es ist nutzlos, das gleiche Ergebnis, das ich bekomme, (Cyan Hintergrund angewendet, aber FontStyle nicht kursiv). –

+0

hast du auch den fontstyle hinzugefügt? –

Antwort

0

Es sieht so aus, als ob Sie einen globalen Stil auf alle DataGridRow in jedem anwenden möchten DataGrid in mehreren Fenstern, und Sie möchten auch zusätzliche Styling auf DataGridRow in einem oder mehreren DataGrid s in einem bestimmten Fenster anwenden.

Wenn Sie CSS vor gelernt haben, können Sie Stylesheets erwarten kumulativ zu sein: In CSS, wenn Sie tr.style1 global und lokal tr.style2 anwenden, erhalten Sie beide, mit tr.style2 den Münzwurf in jedem Fall zu gewinnen, wo sie das gleiche Attribut .

So funktionieren Stile in XAML nicht. In XAML kann ein Element das Styling von seinem Elternelement erben, aber es kann höchstens ein eigenes Style haben. Zusätzlich, wie Sie gefunden haben, Style hat eine BasedOn Eigenschaft. Sie können einen Stil auf einen anderen setzen und die kumulativen Effekte von beiden erhalten.

Schließlich gibt es mehrere Möglichkeiten, einen Stil anzuwenden. Sie haben festgestellt, dass Sie sie auf jedes Element eines bestimmten Typs in einem bestimmten Bereich anwenden können.

Leider, da alles vom Kontext abhängig ist, kann die Art und Weise, wie XAML-Stile angewendet werden, anfangs sehr verwirrend sein (und zum zweiten und manchmal dritten). Insbesondere, wenn Sie einen Stil verwenden (GridStyle1), um einen anderen Stil anzuwenden. Es ist nicht immer offensichtlich, was was außer Kraft setzt.

Es ist am besten, die Dinge so einfach wie möglich zu halten. Wir werden diesen RowStyle Setter loswerden, weil wir ihn nicht brauchen. Wir erstellen einfach eine globale DataGridRowStyle, die standardmäßig auf alle DataGridRow überall angewendet wird, und dann überschreiben wir das speziell in window1.xaml.

App.xaml

<Application.Resources> 
    <Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
     <Setter Property="Background" Value="Cyan" /> 
    </Style> 
</Application.Resources> 

Window1.xaml

<Window.Resources> 
    <Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
     <Setter Property="FontStyle" Value="Italic" /> 
    </Style> 
</Window.Resources> 

, die jedem DataGridRow in diesem Fenster gelten. Das Attribut BasedOn dort bezieht sich auf alle Stile, die bereits für DataGridRow in einem beliebigen enthaltenden Kontext definiert wurden - im Allgemeinen bedeutet das App.xaml, und wenn wir nichts hinzufügen, wird das hier der Fall sein.

Der Unterschied zwischen diesem und dem, was Sie hatten, war, dass Sie den Cyan Background Stil auf eine andere Weise anwendeten: Der DataGridRow Stil, den Sie in App anwendeten.Xaml wurde über den RowStyle Setter auf Ihre DataGrid Art angewendet. Dieser Stil war BasedOn WPF voreingestellten Standard Style für DataGridRow, und dann wurde es zwangsweise auf jede DataGridRow in jeder DataGrid, die GridStyle1 Stil verwendet.

Der DataGridRow Stil, den Sie in Window1.xaml definiert würde angewendet haben, wenn DataGrid.RowStyle nicht bereits in GridStyle1 gesetzt worden war.

Aber wie wir gesehen haben, brauchen Sie nicht RowStyle zu verwenden, um einen Stil global für jeden DataGridRow anzuwenden. Sie können das mit dem Standardstil für diesen Typ tun, wie oben in meinem App.xaml-Fragment. DataGrid.RowStyle ist nützlich für einzeln überschreiben die globale DataGridRow Stil auf einer bestimmten DataGrid. Aber das wollen Sie nicht global! So Ihre Stile in App.xaml sollte wie folgt aussehen:

App.xaml

<Style TargetType="DataGrid" x:Key="GridStyle1"> 
    <Setter Property="HorizontalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="VerticalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="AlternatingRowBackground" Value="WhiteSmoke" /> 
    <Setter Property="RowHeight" Value="30" /> 
</Style> 

<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
    <Setter Property="Background" Value="Cyan" /> 
</Style> 

Und wieder, hier ist der Style in Window1.xaml

<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
    <Setter Property="FontStyle" Value="Italic" /> 
</Style> 

Extra Credit

Die oben genannten Stile sollten Ihr Problem lösen.

Aber es gibt andere Möglichkeiten, sich diesem Thema zu nähern. Es sei denn, Sie sind mit dem, was wir oben getan haben, sehr zufrieden. Was folgt, kann Verwirrung stiften. Wenn Sie also anfangen, dies zu lesen, und je mehr Sie lesen, desto weniger verstehen Sie - dann hören Sie auf zu lesen! Es kann warten!

Sie auch alle Texte in einer DataGrid kursiv machen könnte, aber das ändert sich die Header auch so glaube ich nicht, es ist das, was Sie wollen:

<DataGrid 
    FontStyle="Italic" 
    /> 

Wenn Sie genau das Italic Stil anwenden möchten Ein Raster in window1.xaml, hier ist, wie das geht. Wenn wir ein Attribut zu einem Style hinzufügen, wird es nicht auf jeden DataGridRow im Geltungsbereich angewendet. Stattdessen sitzt es nur da und wartet darauf, dass es als Name StaticResource verwendet wird.

Window1.xaml

<Window.Resources> 
    <Style x:Key="ItalicDataGridRowStyle" 
      TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
     <Setter Property="FontStyle" Value="Italic" /> 
    </Style> 
</Window.Resources> 

<-- ... --> 

<!-- One grid with italic rows --> 
<DataGrid 
    x:Name="dataGrid1" 
    RowStyle="{StaticResource ItalicDataGridRowStyle}" 
    /> 

<!-- And another grid with default rows --> 
<DataGrid 
    x:Name="dataGrid2" 
    /> 

Und hier ist eine andere Art und Weise Styling in nur einem Gitter in Window1.xaml zu den Zeilen anzuwenden:

<!-- Yet another grid --> 
<DataGrid 
    x:Name="dataGrid3" 
    > 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow" BasedOn="{StaticResource ItalicDataGridRowStyle}"> 
      <Setter Property="FontWeight" Value="Bold" /> 
      <Setter Property="Background" Value="Wheat" /> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

Schließlich Sie könnte Set RowStyle in GridStyle1, und setzen Sie dann explizit RowStyle auf bestimmte Raster in bestimmten Fenstern, wie oben. Das würde funktionieren. Sie hätten auch einen neuen DataGrid Stil in window1.xaml (basierend auf GridStyle1) erstellen können, der RowStyle auf etwas anderes setzt.

Verwandte Themen