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 DataGridRow
Style
, 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.
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. –
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). –
hast du auch den fontstyle hinzugefügt? –