Frage

Ich habe kürzlich ein Projekt von WPF 3.5 in WPF 4.0 konvertiert. Funktionell funktioniert alles, aber der Datagrid -Stil, den ich mich auf das Aero -Thema bewerbe, hat plötzlich nicht mehr funktioniert. Wie Sie aus den Vor-/Nachher -Bildern unten sehen können, haben meine DataGrids einen Aero -Look plus kräftige Überschriften, zusätzliche Polsterung und abwechselnde Reihenformate bis hin zu einfachem "Aero" aussehen. Abgesehen von der Entfernung aller Verweise auf das WPF -Toolkit (da der Datagrid jetzt in WPF 4.0 nativ ist), habe ich wirklich nichts an meinem Code/Markup geändert.

Vor (WPF Toolkit DataGrid)

Looks like Aero w/ bold headings, extra padding, and alternate row styles

Nach (.net 4.0 datagrid)

Looks like Aero w/ nothing

Wie ich gelernt habe eine frühere Frage, Ich kann das benutzerdefinierte DataGrid -Styling wieder zum Laufen bringen, wenn ich aufhöre, auf das Aero -Ressourcenwörterbuch zu verweisen, aber dann sieht alles auf Windows XP "Luna" aus (was ich nicht will).

Wie stelle ich sicher, dass meine App immer das Aero -Thema verwendet, aber trotzdem das Styling auf diesem Thema anwendet? in WPF 4.0?

Hier ist mein App.xaml -Code:

<Application
    x:Class="TempProj.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary
                    Source="/PresentationFramework.Aero,
                        Version=3.0.0.0,
                        Culture=neutral,
                        PublicKeyToken=31bf3856ad364e35,
                        ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
                <ResourceDictionary Source="/CommonLibraryWpf;component/ResourceDictionaries/DataGridResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Hier ist mein DataGridResourcedictionary.xaml -Code:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="DataGrid_ColumnHeaderStyle" TargetType="DataGridColumnHeader">
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
        <Setter Property="TextBlock.TextWrapping" Value="WrapWithOverflow" />
    </Style>
    <Style x:Key="DataGrid_CellStyle" TargetType="DataGridCell">
        <Setter Property="Padding" Value="5,5,5,5" />
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridCell">
                    <Border Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}">
                        <ContentPresenter />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style TargetType="DataGrid">
        <Setter Property="ColumnHeaderStyle" Value="{StaticResource DataGrid_ColumnHeaderStyle}" />
        <Setter Property="CellStyle" Value="{StaticResource DataGrid_CellStyle}" />
        <Setter Property="Background" Value="White" />
        <Setter Property="AlternatingRowBackground" Value="#F0F0F0" />
        <Setter Property="VerticalGridLinesBrush" Value="LightGray" />
        <Setter Property="HeadersVisibility" Value="Column" />
        <Setter Property="SelectionMode" Value="Single" />
        <Setter Property="SelectionUnit" Value="FullRow" />
        <Setter Property="GridLinesVisibility" Value="Vertical" />
        <Setter Property="AutoGenerateColumns" Value="False" />
        <Setter Property="CanUserAddRows" Value="False" />
        <Setter Property="CanUserDeleteRows" Value="False" />
        <Setter Property="CanUserReorderColumns" Value="True" />
        <Setter Property="CanUserResizeColumns" Value="True" />
        <Setter Property="CanUserResizeRows" Value="False" />
        <Setter Property="CanUserSortColumns" Value="True" />
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="BorderBrush" Value="#DDDDDD" />
        <Setter Property="HorizontalGridLinesBrush" Value="#DDDDDD" />
        <Setter Property="VerticalGridLinesBrush" Value="#DDDDDD" />
    </Style>
    <Style x:Key="DataGrid_FixedStyle" TargetType="DataGrid" BasedOn="{StaticResource {x:Type DataGrid}}">
        <Setter Property="CanUserReorderColumns" Value="False" />
        <Setter Property="CanUserResizeColumns" Value="False" />
        <Setter Property="CanUserResizeRows" Value="False" />
        <Setter Property="CanUserSortColumns" Value="False" />
    </Style>
</ResourceDictionary>

Hier ist eine Nutzungsprobe:

<DataGrid
    Grid.Row="0"
    Grid.Column="0"
    Style="{StaticResource DataGrid_FixedStyle}"
    ItemsSource="{Binding Coordinates}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding X}" Header="X" />
        <DataGridTextColumn Binding="{Binding Y}" Header="Y" />
        <DataGridTextColumn Binding="{Binding Z}" Header="Z" />
    </DataGrid.Columns>
</DataGrid>

Bearbeiten

Mir ist einfach der Gedanke gekommen, dass das Problem vielleicht darin besteht, dass ich auf die falsche Version des Aero -Frameworks hinweist.

Folgendes habe ich jetzt:

<ResourceDictionary
    Source="/PresentationFramework.Aero,
        Version=3.0.0.0,
        Culture=neutral,
        PublicKeyToken=31bf3856ad364e35,
        ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />

Sollte dies auf Version 4.0 aktualisiert werden? Was ist der PublicKeyToken für Version 4 (oder wie finde ich das heraus)?

War es hilfreich?

Lösung

Relativ kurze Antwort

Das Laden der Ressourcen eines Themas ist nicht das gleiche wie das Ändern des Themas auf Betriebssystemebene. Das Laden der Ressourcen eines Themas kann nachteilige Auswirkungen haben. Aus Sicht von WPF ist in der Anwendung eine große Anzahl von impliziten Stilen vorhanden. Diese Stile können andere Stile übertrumpfen. Das Endergebnis behandelt ein Thema, wie eine Anwendungshaut kann nicht ohne Verfeinerungen funktioniert.

Es gibt einige alternative Möglichkeiten zur Simulation einer Themenänderung.

Dieses Problem zeigt einige ziemlich komplexe WPF -Funktionalität, und ein Teil davon scheint undokumentiert zu sein. Es scheint jedoch kein Fehler zu sein. Wenn es sich nicht um einen Fehler handelt - das heißt, wenn alles beabsichtigtes WPF -Verhalten ist - könnten Sie argumentieren, dass das WPF -Datagrid in einigen Bereichen schlecht gestaltet ist.

Melaks Antwort war sehr auf dem richtigen Weg. Das Problem ist jedoch löslich und kann gelöst werden, ohne Ihr Design zu beeinträchtigen oder sich wiederholende Stileinstellungen zu erfordern. Und vielleicht noch wichtiger ist, dass das Problem ist Debuggable.

Die folgenden XAML funktioniert. Ich ließ das alte XAML kommentierte, nur um die Änderungen sichtbarer zu machen. Für einen ausführlicheren Blick auf das Problem sehen Sie sich das Problem an lange Antwort.

DataGridResourcedictionary.xaml:

<ResourceDictionary    
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!--
    <Style x:Key="DataGrid_ColumnHeaderStyle" TargetType="DataGridColumnHeader">
    -->
    <Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">

        <!--New-->
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <!---->

        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
        <Setter Property="TextBlock.TextWrapping" Value="WrapWithOverflow" />
    </Style>

    <!--
    <Style x:Key="DataGrid_CellStyle" TargetType="DataGridCell">
    -->
    <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Setter Property="Padding" Value="5,5,5,5" />
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
        <Setter Property="Template">
            <Setter.Value>
                <!--
                <ControlTemplate TargetType="DataGridCell">
                    <Border Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}">
                        <ContentPresenter />
                    </Border>
                </ControlTemplate>
                -->
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Border 
                        Padding="{TemplateBinding Padding}"
                        Background="{TemplateBinding Background}" 
                        BorderBrush="{TemplateBinding BorderBrush}"  
                        BorderThickness="{TemplateBinding BorderThickness}" 
                        SnapsToDevicePixels="True">
                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

        <!--Additional Feature-->
        <!--
            Remove keyboard focus cues on cells and tabbing on cells when
            only rows are selectable and the DataGrid is readonly.

            Note that having some kind of keyboard focus cue is
            typically desirable.  For example, the lack of any keyboard 
            focus cues could be confusing if an application has multiple
            controls and each control is showing something selected, yet
            there is no keyboard focus cue.  It's not necessarily obvious
            what would happen if Control+C or Tab is pressed.

            So, when only rows are selectable and the DataGrid is readonly,
            is would be ideal to make cells not focusable at all, make
            the entire row focusable, and make sure the row has a focus cue.
            It would take much more investigation to implement this.
        -->
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=SelectionUnit}" Value="FullRow"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=IsReadOnly}" Value="True"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Background}" />
                <Setter Property="FocusVisualStyle" Value="{x:Null}" />
                <Setter Property="IsTabStop" Value="False" />
            </MultiDataTrigger>
        </Style.Triggers>
        <!---->
    </Style>

    <!--
    <Style TargetType="DataGrid">
    --> 
    <Style TargetType="DataGrid" BasedOn="{StaticResource {x:Type DataGrid}}">

        <!--Unworkable Design-->
        <!--
        <Setter Property="ColumnHeaderStyle" Value="{StaticResource DataGrid_ColumnHeaderStyle}" />
        <Setter Property="CellStyle" Value="{StaticResource DataGrid_CellStyle}" />
        -->

        <Setter Property="Background" Value="White" />
        <Setter Property="AlternatingRowBackground" Value="#F0F0F0" />


        <!--This was a duplicate of the final PropertySetter.-->
        <!-- 
        <Setter Property="VerticalGridLinesBrush" Value="LightGray" />
        -->

        <Setter Property="HeadersVisibility" Value="Column" />
        <Setter Property="SelectionMode" Value="Single" />
        <Setter Property="SelectionUnit" Value="FullRow" />
        <Setter Property="GridLinesVisibility" Value="Vertical" />
        <Setter Property="AutoGenerateColumns" Value="False" />
        <Setter Property="CanUserAddRows" Value="False" />
        <Setter Property="CanUserDeleteRows" Value="False" />
        <Setter Property="CanUserReorderColumns" Value="True" />
        <Setter Property="CanUserResizeColumns" Value="True" />
        <Setter Property="CanUserResizeRows" Value="False" />
        <Setter Property="CanUserSortColumns" Value="True" />
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="BorderBrush" Value="#DDDDDD" />
        <Setter Property="HorizontalGridLinesBrush" Value="#DDDDDD" />
        <Setter Property="VerticalGridLinesBrush" Value="#DDDDDD" />
    </Style>

    <Style x:Key="DataGrid_FixedStyle" TargetType="DataGrid" BasedOn="{StaticResource {x:Type DataGrid}}">
        <Setter Property="CanUserReorderColumns" Value="False" />
        <Setter Property="CanUserResizeColumns" Value="False" />
        <Setter Property="CanUserResizeRows" Value="False" />
        <Setter Property="CanUserSortColumns" Value="False" />
    </Style>
</ResourceDictionary>

App.xaml:

<Application    
    x:Class="TempProj.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!--
                <ResourceDictionary                    
                    Source="/PresentationFramework.Aero,                        
                            Version=3.0.0.0,                     
                            Culture=neutral,                        
                            PublicKeyToken=31bf3856ad364e35,                        
                            ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
                -->
                <ResourceDictionary                    
                    Source="/PresentationFramework.Aero,                        
                            Version=4.0.0.0,                     
                            Culture=neutral,                        
                            PublicKeyToken=31bf3856ad364e35,                        
                            ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
                <!--New-->
                <!--
                    This is a modified replica of the DataGridRow Style in the Aero skin that's 
                    evaluated next.  We are hiding that Style and replacing it with this.
                -->
                <ResourceDictionary>
                    <Style x:Key="{x:Type DataGridRow}" TargetType="{x:Type DataGridRow}">
                        <!--
                            DataGridRow.Background must not be set in this application.  DataGridRow.Background
                            must only be set in the theme.  If it is set in the application, 
                            DataGrid.AlternatingRowBackground will not function properly.

                            See: https://stackoverflow.com/questions/4239714/why-cant-i-style-a-control-with-the-aero-theme-applied-in-wpf-4-0

                            The removal of this Setter is the only modification we have made.
                        -->
                        <!--
                        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
                        -->

                        <Setter Property="SnapsToDevicePixels" Value="true"/>
                        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
                        <Setter Property="ValidationErrorTemplate">
                            <Setter.Value>
                                <ControlTemplate>
                                    <TextBlock Margin="2,0,0,0" VerticalAlignment="Center" Foreground="Red" Text="!" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type DataGridRow}">
                                    <Border x:Name="DGR_Border"
                                            Background="{TemplateBinding Background}"
                                            BorderBrush="{TemplateBinding BorderBrush}"
                                            BorderThickness="{TemplateBinding BorderThickness}"
                                            SnapsToDevicePixels="True">
                                        <SelectiveScrollingGrid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="Auto"/>
                                                <ColumnDefinition Width="*"/>
                                            </Grid.ColumnDefinitions>

                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="*"/>
                                                <RowDefinition Height="Auto"/>
                                            </Grid.RowDefinitions>

                                            <DataGridCellsPresenter Grid.Column="1"
                                             ItemsPanel="{TemplateBinding ItemsPanel}"
                                             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

                                            <DataGridDetailsPresenter  SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=AreRowDetailsFrozen, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}}"
                                                Grid.Column="1" Grid.Row="1"
                                                Visibility="{TemplateBinding DetailsVisibility}" />

                                            <DataGridRowHeader SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"  Grid.RowSpan="2"
                                                Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.Row}}"/>
                                        </SelectiveScrollingGrid>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ResourceDictionary>
                <!---->

                <ResourceDictionary Source="/CommonLibraryWpf;component/ResourceDictionaries/DataGridResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

MainWindow.xaml:

<Window 
    x:Class="TempProj.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Vector3DCollection x:Key="Coordinates">
            <Vector3D X="1" Y="0" Z="0"/>
            <Vector3D X="0" Y="22" Z="0"/>
            <Vector3D X="0" Y="0" Z="333"/>
            <Vector3D X="0" Y="4444" Z="0"/>
            <Vector3D X="55555" Y="0" Z="0"/>
        </Vector3DCollection>
    </Window.Resources>
    <Grid>
        <DataGrid
            Grid.Row="0"    
            Grid.Column="0"    
            Style="{StaticResource DataGrid_FixedStyle}"
            ItemsSource="{StaticResource Coordinates}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding X}" Header="X" />
                <DataGridTextColumn Binding="{Binding Y}" Header="Y" />
                <DataGridTextColumn Binding="{Binding Z}" Header="Z" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Andere Tipps

Lange Antwort

Der Vorherige kurze Antwort Bietet einige XAML, um das Problem sowie eine kurze Zusammenfassung dessen zu beheben, was es verursacht.

Das Laden der Ressourcen eines Themas ist nicht das gleiche wie das Ändern des Themas auf Betriebssystemebene. Das Laden der Ressourcen eines Themas kann nachteilige Auswirkungen haben. Aus Sicht von WPF ist in der Anwendung eine große Anzahl von impliziten Stilen vorhanden. Diese Stile können andere Stile übertrumpfen. Das Endergebnis behandelt ein Thema, wie eine Anwendungshaut kann nicht ohne Verfeinerungen funktioniert.

Die folgende lange Antwort liefert eine eingehendere Diskussion des Problems. Einige Hintergrundthemen werden zuerst behandelt. Dies wird einige der peripheren Fragen beantworten, die auch eine bessere Grundlage für das Verständnis der jeweiligen Probleme bieten. Danach werden individuelle Aspekte des Problems angespannt und mit einer effektiven Debugging -Strategie angesprochen.

Thema gegen Haut

Dies war eine großartige Frage, teilweise darauf, dass Hunderte von Bloggern und Forum -Threads empfehlen, ein Thema aus der Datei zu laden, um „Ihr Thema zu ändern“. Einige der Autoren, die diese Empfehlung bei Microsoft funktionieren, und viele der Autoren sind offensichtlich hochkarätige Software -Ingenieure. Dieser Ansatz erscheint die meiste Zeit arbeiten. Wie Sie bemerkten, funktionierte dieser Ansatz jedoch nicht genau in Ihrem Szenario und erforderte eine Reihe von Verfeinerungen.

Ein Teil dieses Problems ergibt sich aus der ungenauen Terminologie. Leider ist das Wort Thema hoffnungslos überladen. Eine genaue Definition für ein Thema, das Verwirrung vermeiden würde, ist einfach Das Systemthema. EIN Systemthema Definiert das Standardeintritt von Win32 -Visuals auf der Maschine. Mein Betriebssystem ist Vista. Meine installierten Themen befinden sich bei C: Windows Resources Themes. In diesem Ordner befinden sich zwei Dateien: Aero.theme und Windows Classic.theme. Wenn ich das Thema ändern möchte, gehe ich entweder [personalisieren | Thema] oder [personalisieren | Fensterfarbe und Aussehen | Farbschema]. Obwohl es nicht sofort offensichtlich ist, können die Optionen, die ich von allen auswählen kann, entweder auf Aero oder klassisch und zusätzliche Verfeinerungen. Da ein WPF -Fenster seinen Clientbereich anstelle, anstatt eine Reihe von Win32 -Steuerelementen zu verfassen, respektiert der Clientbereich das Thema nicht automatisch. Die Themen -Assemblies (z. B. PräsentationFramework.aero.dll) bieten eine Grundlage für die Erweiterung der Themenfunktionalität in WPF -Windows.

enter image description here enter image description here

Die allgemeinere Definition des Themas ist jede Erscheinungs- und Gefühlskonfiguration auf jeder Ebene der Granularität (Betriebssystem, Anwendung, Kontrolle). Wenn Menschen die allgemeine Definition verwenden, besteht das Potenzial für verschiedene Verwirrungsgrade. Beachten Sie, dass MSDN zwischen der genauen Definition und der allgemeinen Definition ohne Vorwarnung wechselt!

Viele Leute würden sagen, dass Sie eine Anwendung geladen haben Haut, kein Thema. Jedes Wort ist wohl richtig, aber ich würde dieses mentale Modell nur deshalb empfehlen, weil es weniger Verwirrung verursacht.

Wie stelle ich sicher, dass meine App immer den Aero verwendet? Thema…? [Betonung hinzugefügt

Auch hier könnte man gesagt werden, dass Sie Aero's Ressourcen laden als Haut. Insbesondere laden Sie das Ressourcenwesensinnere im Inside PresentionFramework.aero.dll. Diese Ressourcen erhielten zuvor eine Sonderbehandlung, da sie Standardressourcen waren. Sobald sie jedoch in der Anwendung sind, werden sie jedoch wie jede andere willkürliche Sammlung von Ressourcen behandelt. Natürlich ist Aero's Ressourcenictionary umfassend. Da es im Anwendungsbereich geladen wird, verbergt es jeden Standardstil, der vom Thema (Luna, in Ihrem Fall) bereitgestellt wird, und einige andere Stile, was das Problem verursacht. Beachten Sie, dass das Thema letztendlich immer noch das gleiche ist (Luna).

Wie oben angedeutet, ist das Thema daran beteiligt Vorrang im Stil, was selbst eine Form von ist Abhängigkeitseigenschaft Vorrang. Diese Vorrangregeln entmystifizieren das beobachtete Verhalten im Problem erheblich.

Explizite Stil. Die Style -Eigenschaft wird direkt eingestellt. In den meisten Szenarien wird der Stil nicht inline definiert, sondern als Ressource bezeichnet, durch explizite Schlüssel…

Implizite Stil. Die Style -Eigenschaft wird nicht direkt eingestellt. Der Stil existiert jedoch auf einer bestimmten Ebene in der Ressourcen -Lookup -Sequenz (Seite, Anwendung) und wird mit einem Ressourcentaste gekennzeichnet, der dem Typ entspricht, auf den der Stil angewendet werden soll.

Standardstil, auch bekannt als Themenstil. Die Style-Eigenschaft wird nicht direkt festgelegt und wird tatsächlich als NULL gelesen ... in diesem Fall stammt der Stil aus der Bewertung der Laufzeit-Themenbewertung, die Teil der WPF-Präsentationsmaschine ist.

Dies Blog-Eintrag Wirf einen viel tieferen Blick auf den Stil und den Standardstil.

.NET Assembly Inspection

Dies war auch eine großartige Frage, teilweise, weil es so viele bewegliche Teile gibt. Ohne eine wirksame Debugging -Strategie wird es fast unmöglich sein zu verstehen, was los ist. In diesem Sinne ist die Inspektion von .NET -Assemblierung ein natürlicher Ausgangspunkt.

Aus der Sicht von WPF ist ein Thema im Wesentlichen ein als BAML serialisiertes Ressourcenhandel, das in eine reguläre .NET -Assembly eingebettet ist (z. B. PräsentationFramework.aero.dll). Später ist es notwendig, die Themen als einfaches XAML anzusehen, um das Verhalten im Problem zu überprüfen.

Glücklicherweise liefert Microsoft die 4.0 Themen als XAML für die Bequemlichkeit der Entwickler. Ich bin mir nicht sicher, ob die Themen vor 4.0 in irgendeiner Form von Microsoft heruntergeladen werden können.

Für Generalbaugruppen (einschließlich Themen vor dem 4.0) können Sie das (zuvor kostenlose) Tool verwenden Reflektor mit dem BAMLViewer -Plugin Um den BAML zurück in Xaml zu dekompilieren. Obwohl nicht so auffällig, Ilspy ist eine kostenlose Alternative mit einem eingebauten BAML -Dekompiler.

enter image description here

.NET -Baugruppen sind während Ihrer Festplatte übersät und Es ist irgendwie verwirrend. Hier sind ihre Wege auf meiner Maschine, für die ich irgendwie ein Bauchgefühl habe und manchmal ohne Versuch und Irrtum erinnern kann.

Aero 3.0

C: Programmdateien Referenzbaugruppen Microsoft Framework V3.0 PräsentationFramework.aero.dll

Aero 4.0

C: Windows microsoft.net Assembly gac_msil presidentFramework.aero v4.0_4.0.0.0__31bf3856ad364e35 Präsentationframework.aero.dll

Was ist der PublicKeyToken für Version 4 (oder wie finde ich das heraus)?

Am einfachsten ist es, Reflektor zu verwenden. Das PublicKeyToken ist der gleiche wie zuvor: 31BF3856AD364E35

enter image description here

Zusätzlich, sn.exe (Aus dem Windows SDK) kann die Ansammlungsinformationen extrahieren.

Auf meiner Maschine lautet der Befehl:

C: Programmdateien Microsoft SDKs Windows V7.1 bin> sn.exe -tp "C: Windows microsoft.net Assembly gac_mil presidentFramework.aero v4.0.0.0__31bf3856ad364e35 5Ramework. Aero.dll "

enter image description here

Themen als Häute laden

Sollte (die Referenz für PräsentationFramework.aero) auf Version 4.0 aktualisiert werden?

Ganz sicher. Das Datagrid existierte in der .NET FCL vor 4.0 nicht. Es gibt verschiedene Möglichkeiten, dies zu bestätigen, aber das intuitivste ist, dass Sie nach Ihrem eigenen Zulassung zuvor über das WPF -Toolkit darauf zugegriffen haben. Wenn Sie die PräsentationsFramework nicht laden.

Jetzt stellt sich heraus, dass es nicht einmal wichtig ist. Ich werde das ursprüngliche XAML verwenden, beim Laden des Debuggers einbrechen und die von Anwendungen gescopten Ressourcen inspizieren.

enter image description here

Wie erwartet gibt es zwei Ressourcen in der FugedDictionaries -Eigenschaft der Anwendung, und das erste Ressourcenhandelsvermögen ist angeblich die 3.0 -Version von PresentationFramework.aero. Ich sehe jedoch, dass es gibt 266 Ressourcen im ersten Ressourcen. Zu diesem Zeitpunkt ist es einfach so, dass ich weiß, dass es 266 Ressourcen im Aero 4.0 -Thema und nur 243 Ressourcen im Aero 3.0 -Thema gibt. Darüber hinaus gibt es sogar einen Datagrid -Eintrag! Dieses Ressourcenwesen ist in der Tat das Aero 4.0 -Ressourcenwesen.

Vielleicht kann jemand anderes erklären, warum WPF die 4.0 -Baugruppe lädt, wenn 3.0 explizit angegeben wurde. Was ich Ihnen sagen kann, ist, ob die Projekte auf .NET 3.0 (und die Kompilierfehler behoben werden) retargetiert werden, die 3.0 -Version von Aero wird stattdessen geladen.

enter image description here enter image description here

Wie Sie korrekt abgeleitet haben, sollte Aero 4.0 sowieso geladen werden. Es ist einfach nützlich zu wissen, was los ist, während er dies debuggiert.

Problem Nr. 1: Der Datagridstil von Aero wird nicht verwendet

In der DataGrid in dieser Anwendung werden null oder mehr Stile miteinander verkettet, je nachdem, wie Sie style.busedon -Eigenschaften konfigurieren.

Es wird auch einen Standardstil haben, der in Ihrem Fall in das Luna -Thema eingebettet ist.

Ich wusste nur, dass es sich auf das ursprüngliche XAML ansah, dass es ein Stil der Erbschaft gab. Der große Datagridstil mit ~ 20 Setzen setzt seine basierte Einschaffungseigenschaft nicht.

enter image description here

Sie haben eine Stilkette von Länge zwei und Ihr Standardstil stammt aus dem Luna -Thema. Der DataGrid -Stil in Aero's Ressourcenictary wird einfach nicht verwendet.

Hier gibt es zwei große Fragen. Wie kann so etwas überhaupt erst debuggen? Zweitens, was sind die Auswirkungen?

Debugging -Stilketten

Ich würde empfehlen, die Verwendung zu verwenden Schnupfen und/oder WPF -Inspektor WPF -Probleme wie diese zu debuggen.

Version 0.9.9 des WPF -Inspektors hat sogar einen Stilkettenbetrieb. (Ich muss Sie warnen, dass diese Funktion derzeit fehlerhaft und nicht sehr nützlich ist, um diesen Teil der Anwendung zu debuggen. Beachten Sie auch, dass sie den Standardstil als Teil der Kette darstellt.)

Die Leistung dieser Tools ist ihre Fähigkeit, Werte von anzusehen und zu bearbeiten tief verschachtelt Elemente bei Laufzeit. Sie können einfach über ein Element übergehen und seine Informationen werden sofort im Werkzeug auftauchen.

Alternativ, wenn Sie sich nur ein Element auf oberster Ebene wie das DataGrid ansehen möchten, nennen Sie das Element im XAML (z. B. x: name = "dg"). Dann brechen Sie beim Laden des Debuggers ein und legen Sie den Namen des Elements in eine Uhr ein Fenster. Dort können Sie die Style -Kette über die Basis -Eigenschaft inspizieren.

Unten habe ich den Debugger bei der Verwendung der Lösung XAML unterbrochen. Der Datagrid verfügt über drei Stile in der Stilkette mit 4, 17 bzw. 9 Setzen. Ich kann ein wenig tiefer bohren und abgeben, dass der erste Stil "DataGrid_FixedStyle" ist. Wie erwartet ist das zweite der große, implizit DataGrid -Stil aus derselben Datei. Schließlich scheint der dritte Stil aus Aeros Ressourcenwesen zu stammen. Beachten Sie, dass der Standardstil in dieser Kette nicht dargestellt wird.

enter image description here

An diesem Punkt ist zu beachten, dass zwischen dem Datagridstil jedes Themas tatsächlich keine Unterschiede bestehen. Sie können dies überprüfen, indem Sie die DataGrid -Stile von ihrem jeweiligen Abstand nehmen 4.0 Themen, Kopieren Sie sie in separate Textdateien und vergleichen Sie sie dann mit einem Diff -Tool.

In der Tat sind eine moderate Anzahl von Stilen einfach identisch Vom Thema zum Thema. Es ist gut, sich dessen bewusst zu sein. Um dies zu überprüfen, führen Sie einfach einen Diff der gesamten XAML aus, die in zwei verschiedenen Themen gehalten werden.

enter image description here

Beachten Sie, dass es im DataGrid (z. B. DataGridrow) viele verschiedene Elemente gibt und jeder seinen eigenen Stil hat. Obwohl DataGrid -Stile derzeit von Themen zu Themen identisch sind, können die Stile für diese verschachtelten Elemente variieren. Basierend auf dem beobachteten Verhalten im Problem ist klar, dass einige dies tun.

Implikationen des ursprünglichen XAML, der den Datagridstil von Aero nicht enthält

Da DataGrid -Stile in den 4.0 -Themen identisch sind, ist in diesem Fall der Datagrid -Stil von Aero zum Ende der Stilkette hinzufügt Grundsätzlich überflüssig. Der Datagrid -Stil von Aero entspricht dem Standard -Datagrid -Stil (in Ihrem Fall). Natürlich könnten zukünftige Themen immer Schwankungen in Bezug auf den Datagridstil haben.

Unabhängig davon, ob es Auswirkungen gibt, da Sie beabsichtigten, die Stile von Aero zu integrieren, ist es eindeutig korrekt, dies zu tun, bis es einen bestimmten Grund gibt, dies nicht zu tun (was später diskutiert wird).

Vor allem ist es einfach nützlich zu wissen, was los ist.

Style.basedon hat nur eine Bedeutung im Kontext, in dem es verwendet wird

In der Lösung XAML funktioniert DataGridResourcediction.xaml genau so, wie es funktioniert. Es ist wichtig zu verstehen, warum, und es ist wichtig zu verstehen, dass die Verwendung auf diese Weise dazu führt, dass es auf andere Weise verwendet wird.

Nehmen wir an, die endgültigen Stile in DataGridResourcedictionary.xamls Stilketten setzen ihre basierten Ein Eigenschaften auf einen Typtaste (z. B. basierton = "{staticResource {x: type datagrid}}"). Wenn sie das tun, dann erben sie von einem impliziten Stil, der diesem Schlüssel entspricht. Der Stil, von dem sie er erben, hängt jedoch davon ab, wo datagridResourcedictionary.xaml geladen wird. Wenn beispielsweise DataGridResourcedictionary.xaml direkt nach dem Laden der Ressourcen von Aero in ein fusioniertes Wörterbuch geladen wird, erben die Stile von den entsprechenden Aero -Stilen. Wenn beispielsweise DataGridResourcedictionary.xaml das einzige Ressourcenwiderhandel ist, das in der gesamten Anwendung geladen wird, erben die Stile tatsächlich von den relevanten Stilen im aktuellen Thema (Luna, in Ihrem Fall). Beachten Sie, dass die Stile des Themas natürlich auch die Standardstile sein werden!

enter image description here

Nehmen wir nun die endgültigen Stile in DataGridResourcedictionary.xamls Stilketten an. unterlassen Sie Setzen Sie ihre basierten Ein Eigenschaften. Wenn sie das tun, dann sind sie die endgültigen Stile in ihren jeweiligen Stilketten, und die einzigen anderen Stile, die bewertet wurden, sind die Standardstile (immer im Thema). Beachten Sie, dass dies Ihr beabsichtigtes Design des Ladens von Aero als Haut abtöten und selektiv Teile davon verfeinert.

Beachten Sie, dass in den vorherigen Beispielen, wenn der letzte Schlüssel eine Zeichenfolge (z. B. x: key = "mystringKey) anstelle eines Typs war, dieselben Dinge passieren würden, aber es würde keine passenden Stile in den Themen oder in geben die Aero -Haut. Eine Ausnahme würde zur Ladezeit geworfen. Das heißt, baumelnde Saitenschlüssel könnten theoretisch funktionieren, wenn immer ein Kontext besteht, in dem ein passender Stil gefunden wurde.

In der Lösung XAML wurde DataGridResourcediction.xaml geändert. Stile am Ende jeder Stilkette erben jetzt von einem zusätzlichen, impliziten Stil. Wenn Sie in app.xaml geladen werden, werden diese auf Aero -Stile gelöst.

Problem Nr. 2: DataGrid.ColumnHeaderSyle und Datagrid.Cellstyle

Dies ist ein böses Problem und es ist verantwortlich für einige der seltsamen Verhaltensweisen, die Sie gesehen haben. DataGrid.ColumnHeaDerSyle und DataGrid.cellstyle werden von impliziten DataGridColumnHeader- und DataGridcell -Stilen übertrumpft. Das heißt, sie sind mit der Aero -Haut unvereinbar. Somit werden sie einfach aus der Lösung XAML entfernt.

Der Rest dieses Unterabschnitts ist eine gründliche Untersuchung des Problems. DataGridColumnHeader und Datagridcell verfügen wie alle Frameworkelements über eine Style -Eigenschaft. Darüber hinaus gibt es einige sehr ähnliche Eigenschaften für DataGrid: ColumnheaNeStyle und Cellstyle. Sie können diese beiden Eigenschaften als „Helfer -Eigenschaften“ bezeichnen. Sie zeichnen zumindest konzeptionell an DataGridColumnHeader.Style und DataGridcell.Style ab. Wie sie tatsächlich verwendet werden, ist undokumentiert, also müssen wir tiefer graben.

Die Eigenschaften DataGridColumnHeader.Style und DataGridcell.Style -Verwendung Wert Zwang. Das bedeutet, dass bei der Ausfragung eines beiden Stils spezielle Rückrufe verwendet werden, um zu bestimmen, welcher Stil tatsächlich an den Anrufer zurückgegeben wird (zum größten Teil des internen WPF -Codes). Diese Rückrufe können zurückkehren irgendein Wert, den sie wollen. Letztendlich sind DataGrid.ColumnHeaderSyle und Datagrid.cellstyle Kandidat Rückgabewerte in den jeweiligen Rückrufen.

Mit Reflektor kann ich das alles leicht bestimmen. (Bei Bedarf ist es auch möglich Treten Sie durch .NET -Quellcode durch..) Ab dem statischen Konstruktor von DataGridColumnHeader finde ich die Style -Eigenschaft und sehe, dass sie zusätzliche Metadaten zugewiesen wird. Insbesondere wird ein Zwangsruf angegeben. Beginnend mit diesem Rückruf klicke ich durch eine Folge von Methodenaufrufen und sehe schnell, was los ist. (Beachten Sie, dass DataGridcell dasselbe tut, damit ich es nicht behandelt.)

enter image description here

Die endgültige Methode, DataGridHelper.getCoercedTransferPropertyValue, vergleicht im Wesentlichen die Quelle von DataGridColumnHeader.Style und Datagrid.ColumnHeaDerSyle. Welche Quelle immer höhere Vorrang hat, gewinnt. Die Vorrangregeln in dieser Methode basieren auf Abhängigkeitseigenschaftsvorbereitungen.

Zu diesem Zeitpunkt wird DataGrid.ColumnHeaderSyle sowohl im ursprünglichen XAML als auch in der Lösung XAML inspiziert. Eine kleine Informationsmatrix wird gesammelt. Letztendlich erklärt dies das beobachtete Verhalten in jeder Anwendung.

In der ursprünglichen XAML breche ich den Debugger ein und sehe, dass DataGrid.ColumnHeaDerSyle eine "Stil" -Sequelle hat. Dies ist sinnvoll, da es in einem Stil eingestellt wurde.

enter image description here enter image description here

In der Lösung XAML breche ich im Debugger ein und sehe, dass DataGrid.ColumnHeaDerSyle eine "Standard" -Squelle hat. Dies ist sinnvoll, da dieser Wert nicht in einem Stil (oder irgendwo anders) festgelegt wurde.

enter image description here enter image description here

Der andere Wert für die Überprüfung ist DataGridColumnHeader.Style. DataGridColumnHeader ist ein zutiefst verschachteltes Element, das beim Debuggen in Visualstudio nicht bequem zugänglich ist. Realistisch gesehen wird ein Werkzeug wie Snoop oder WPF -Inspektor verwendet, um die Eigenschaft zu inspizieren.

Mit dem ursprünglichen XAML hat DataGridColumnHeader.Style eine Quelle "ImplicitStyRereference". Das macht Sinn. DataGridColumnHeaders werden im internen WPF -Code tief in die Tiefe instanziiert. Ihre Style -Eigenschaft ist null und werden nach einem impliziten Stil suchen. Der Baum wird vom DataGridColumnHeader -Element zum Stammelement durchquert. Wie erwartet werden keine Stile gefunden. Dann werden die Anwendungsressourcen überprüft. Sie haben einen String -Key ("DataGrid_ColumnHeaDerSyle") im Lone DataGridColumnHeader -Stil. Dies verbirgt es effektiv in dieser Suche und wird daher nicht verwendet. Dann wird die Aero -Haut durchsucht und ein typischer implizite Stil gefunden. Dies ist der Stil, der verwendet wird.

enter image description here

Wenn dieser Schritt mit der Lösung XAML wiederholt wird, ist das Ergebnis das gleiche: 'ImplicitStyleReference'. Diesmal ist der implizite Stil jedoch der einzige DataGridColumnHeader -Stil in DataGridResourcedictionary.xaml, der jetzt implizit gekennzeichnet ist.

enter image description here

Wenn dieser Schritt schließlich erneut mit dem ursprünglichen XAML wiederholt wird, und die Aero -Haut ist nicht beladen, Das Ergebnis ist jetzt 'Standard'! Dies liegt daran, dass es in der gesamten Anwendung einfach keine impliziten DataGridColumnheader -Stile gibt.

Daher wird DataGrid.ColumnHeaderSyle verwendet, wenn die Aero -Haut nicht geladen ist, aber nicht verwendet wird, wenn die Aero -Haut geladen ist! Wie beworben, Das Laden der Ressourcen eines Themas kann nachteilige Auswirkungen haben.

Es ist viel, um gerade zu bleiben, und die Namen klingen alle gleich. Das folgende Diagramm rundet alle Aktionen zusammen. Denken Sie daran, die Eigenschaft mit der höheren Vorrang gewinnt.

enter image description here

Es ist vielleicht nicht das, was Sie wollen, aber so funktioniert das DataGrid ab WPF 4.0. Unter Berücksichtigung dessen können Sie theoretisch DataGrid.ColumnHeaDerSyle und DataGrid.Cellstyle in einem sehr breiten Bereich festlegen und können immer noch die DataAgridColumnheader- und Datagridcell -Stile in einem engeren Bereich mit impliziten Stilen überschreiben.

Auch hier wird DataGrid.ColumnHeaderSyle und DataGrid.cellstyle von impliziten DataGridColumnHeader- und DataGridcell -Stilen übertrumpft. Das heißt, sie sind mit der Aero -Haut unvereinbar. Somit werden sie einfach aus der Lösung XAML entfernt.

Problem Nr. 3: DataGridrow.background

Wenn die empfohlenen Änderungen bis zu diesem Punkt implementiert wurden, sollte etwas wie folgt auf Ihrem Bildschirm sein. (Denken Sie daran, ich habe mein Thema klassisch eingestellt, um dieses Problem zu debuggen.)

enter image description here

Der Datagrid hat einen Aero -Look, aber AlternatingRowbackground wird nicht respektiert. Jede andere Reihe sollte einen grauen Hintergrund haben.

enter image description here

Mit den bisher diskutierten Debugging -Techniken wird festgestellt, dass Dies ist genau das gleiche Problem wie Problem Nr. 2. Ein implizite Datagridrow -Stil in der Aero -Haut wird jetzt geladen. DataGridrow.background verwendet Eigenschaftszwang. DataGrid.AlternatingRowbackground ist a Kandidat Wert, der im Zwang zurückgegeben werden kann. DataGridrow.background ist ein weiterer Kandidat. Wenn diese Werte stammen, beeinflusst der Wert, den der Zwangsruf auswählt.

Inzwischen sollte es klar sein, aber wenn nicht, muss es wiederholt werden. Das Laden der Ressourcen eines Themas kann nachteilige Auswirkungen haben.

Die kurze Antwort auf dieses Unterproblem lautet DataGridrow. Background darf nur im Thema festgelegt werden. Insbesondere darf es nirgendwo in der Anwendung von einem Stilletter eingestellt werden. Leider ist genau das genau das, was in der Aero -Haut passiert. Es gibt mindestens zwei Möglichkeiten, dieses Problem anzugehen.

Nach der Aero -Haut kann ein leer -implizite Stil hinzugefügt werden. Dies verbirgt den beleidigenden Stil in Aero. Es gibt keine Werte im leeren Stil, so dass Werte aus dem Standardstil verwendet werden. Am Ende funktioniert dies nur, da DataGridrow -Stile in jedem 4.0 -Thema identisch sind.

Alternativ kann der DataGridrow -Stil von Aero kopiert werden, der Hintergrund -Setter kann entfernt und der Rest des Stils nach der Aero -Haut hinzugefügt werden. Die Lösung XAML verwendet diese Technik. Durch die Erweiterung des Stils ist die Anwendung in zukünftigen Szenarien mit größerer Wahrscheinlichkeit weiterhin Aero. Durch die Isolierung dieser Expansion in App.xaml kann DataGridResourcedictionary.xaml in anderen Kontexten freier verwendet werden. Beachten Sie jedoch, dass es jedoch sinnvoller ist, es zu DataGridResourcedictionary.xaml hinzuzufügen, je nachdem, wie diese Datei in Zukunft verwendet wird. In Bezug auf diese Anwendung funktioniert in beiden Fällen.

Problem Nr. 4: DataGridColumnHeader -Layout

Die endgültige Änderung ist ziemlich oberflächlich. Wenn die Anwendung nach den bisher empfohlenen Änderungen ausgeführt wird, haben die DataGridColumnHeaders Inhalte, die eher links ausgerichtet als zentriert sind. Dieses Problem kann mit Snoop oder WPF -Inspektor leicht in den Einsatz gebohrt werden. Die Wurzel des Problems scheint die DataGridColumnHeaders zu sein Horizontalkontentalsignierung auf 'links' eingestellt.

enter image description here

Stellen Sie es auf "Stretch" ein und es funktioniert wie erwartet.

Es gibt ein Zusammenspiel zwischen den Layouteigenschaften und Textblock Formatierungseigenschaften. Snoop und WPF Inspector erlauben das Experimentieren und machen es leicht zu bestimmen, was in einer bestimmten Situation funktioniert.

Abschließende Gedanken

Zusammenfassend lässt sich sagen, dass das Laden der Ressourcen eines Themas nicht das gleiche wie das Ändern des Themas auf Betriebssystemebene ist. Das Laden der Ressourcen eines Themas kann nachteilige Auswirkungen haben. Aus Sicht von WPF ist in der Anwendung eine große Anzahl von impliziten Stilen vorhanden. Diese Stile können andere Stile übertrumpfen. Das Endergebnis behandelt ein Thema, wie eine Anwendungshaut kann nicht ohne Verfeinerungen funktioniert.

Trotzdem bin ich nicht vollständig in der aktuellen WPF -Implementierung in Bezug auf "Helfereigenschaften" (z. B. DataGrid.ColumnHeaderSyle) verkauft, die über einen Zwangsaufruf mit Vorrangregeln verwendet werden. Ich muss mich fragen, warum sie nicht nur lokal ihren beabsichtigten Zielen (z. B. DataGridColumnHeader.Style) zum Initialisierungszeit zugeordnet werden können, wenn die Ziele noch keinen explizit zugewiesenen Wert haben. Ich habe nicht genug darüber nachgedacht, um zu wissen, was die verschiedenen Probleme sein könnten, aber wenn es möglich ist, könnte es das Modell "Helfer Property" intuitiver, besser mit anderen Eigenschaften und narrensicherer machen.

Obwohl es nicht der Schwerpunkt dieser Antwort war, ist es sehr wichtig zu beachten, dass das Laden der Ressourcen eines Themas zum Simulieren des Themas besonders schlecht ist, weil es eine gibt erhebliche Kosten für die Wartbarkeit. Vorhandene Stile in der Anwendung basieren nicht automatisch auf den Stilen im Ressourcenschutz des Themas. Jeder Stil in der Anwendung müsste seine basierte Eigeneigenschaft auf einen Typschlüssel setzen (oder direkt oder indirekt auf einen anderen Stil basieren). Dies ist äußerst belastend und fehleranfällig. Darüber hinaus gibt es die Wartbarkeitskosten in Bezug auf themenbewusste benutzerdefinierte Steuerelemente. Das Themenressourcen Für diese benutzerdefinierten Steuerelemente müssten auch geladen werden, um diese Simulation zu bewirken. Und natürlich könnten Sie nach dem, nachdem Sie dies getan haben, vor Prioritätsproblemen, denen Sie hier ausgesetzt sind!

Wie auch immer, es gibt mehr als einen Weg, eine WPF -App zu häuten (kein Wortspiel beabsichtigt!). Ich hoffe, diese Antwort bietet zusätzliche Einblicke in Ihr Problem und hilft Ihnen und anderen, ähnliche Probleme zu lösen.

Ich denke, das Problem ist kein PräsentationsFramework.aero für sich selbst, sondern dass Sie implizite Datagridstile erhalten, indem Sie es einbeziehen. Dies kann auch gesehen werden, indem dies nur in app.xaml hinzufügt

<Application.Resources>
    <Style TargetType="{x:Type DataGridColumnHeader}"/>
</Application.Resources>

Dies wird dazu führen, dass alle Ihre DataGridColumnHeader ihren Stil verlieren, wenn sie nicht explizit festgelegt sind.

Das wird funktionieren

<DataGrid ColumnHeaderStyle="{StaticResource DataGrid_ColumnHeaderStyle}" ../>

Dies wird jedoch nicht

<DataGrid Style="{StaticResource DataGrid_FixedStyle}" ../>

<Style x:Key="DataGrid_FixedStyle" TargetType="DataGrid">
    <Setter Property="ColumnHeaderStyle"
            Value="{StaticResource DataGrid_ColumnHeaderStyle}" />
</Style>

Ich bin mir nicht sicher. Das einzige, was ich mir vorstellen kann, ist, alle Stile explizit auf das Datagrid selbst zu setzen, aber das könnte unpraktisch sein, insbesondere wenn Sie diesen Stil an vielen Stellen verwenden.

<DataGrid Style="{StaticResource DataGrid_FixedStyle}"
          ColumnHeaderStyle="{StaticResource DataGrid_ColumnHeaderStyle}"
          CellStyle="{StaticResource DataGrid_CellStyle}"
          ... >
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top