2014-12-23 4 views
6

Wie kann ich zuverlässig feststellen, ob das folgende ControlTemplate in einer WPF-Anwendung verwendet wird? Der Dateiname ist "CheckBoxTemplates.xaml" und befindet sich in einer anderen Assembly als die Hauptanwendung. Beachten Sie, dass beim Suchen nach dem Dateinamen und dem Ressourcenschlüssel keine Ergebnisse angezeigt wurden. Darüber hinaus ist die Suche nach einem Ressourcenschlüssel nicht zuverlässig. Insbesondere, wenn fünf Ressourcenwörterbuchdateien denselben Schlüssel enthalten.Wie kann ich zuverlässig feststellen, ob in einer WPF-Anwendung ein `ControlTemplate` verwendet wird?

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna"> 
    <Style x:Key="invertedCheckBox" 
      TargetType="CheckBox"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="CheckBox" 
... 

Weitere Informationen

Während user2250152 answser für die oben XAML korrekt ist. Es wird nicht zuverlässig festgestellt, ob ein Style verwendet wird. Ich sage das, weil ich, als ich die Technik für einen anderen Stil verwendet habe, die fünf Ressourcenwörterbuchdateien gefunden habe, die denselben Schlüssel enthalten. Daher müssen wir uns überlegen, wie ich zuverlässig feststellen kann, welcher Stil mit definierten Duplikaten verwendet wird.

+0

Zur Laufzeit oder Kompilierzeit? –

+0

Entweder. Die Stile in der Anwendung verursachen Probleme. Der erste Schritt besteht darin, tote Stile zu eliminieren. Ich wäre dankbar für jeden möglichen Weg. Selbst ein separates Tool würde helfen. – AMissico

+0

@PatrickHofman; Ich verstehe nicht. – AMissico

Antwort

1

Sie können VisualStudio und das Tool "In Dateien suchen" verwenden. Versuchen Sie, den Stilschlüssel zu finden, zum Beispiel invertedCheckBox in der gesamten Lösung. So können Sie bestimmen, wo der Stil verwendet wird.

+0

Ich habe das schon gemacht und habe den Dateinamen nicht gefunden. Ich habe auch nach dem "Schlüssel" gesucht. Woher weiß ich, ob eine CheckBox diesen Stil verwendet? Deshalb habe ich die Fragen gepostet. Ich brauche einen zuverlässigen Weg. – AMissico

+0

Finden Sie alle "CheckBoxes" in Ihrer Lösung. Überprüfen Sie, ob die 'CheckBox' Stileigenschaft auf' Stil = "{StaticResource invertedCheckBox}" hat. Wenn Sie nichts finden, können Sie sicher sein, dass dieser Stil nicht verwendet wird. – user2250152

+0

Ich tat das und fand keine Verwendung. Ich habe dann ein Testprojekt erstellt und einige Tests durchgeführt. Es scheint, dass, wenn "x: Key" definiert und nicht verwendet wird, der Stil nicht verwendet wird. Es gibt keine implizite Verwendung, da ein Schlüssel immer basierend auf dem 'TargetType' generiert wird. – AMissico

2

Es gibt ein paar Optionen, die ich denken kann:

  • Die ‚Entwicklungszeit‘ Lösung: Dazu gehört ähnlich jede Datei für die Existenz von Style="{StaticResource StyleName}", oder etwas zu suchen. Dies wird in vielen Fällen funktionieren, ist aber nicht automatisiert und nicht sehr zuverlässig;

  • Die Laufzeitlösung: Sie können jedes Steuerelement in der Klassenbibliothek instanziieren und über jedes Element darin iterieren und die aktuell zugewiesene Style überprüfen. Dies funktioniert nur, wenn Styles sofort gesetzt werden und nicht während Events usw .;

  • Die "Code" -Lösung: Sie könnten Ihre eigene statische Fassade Klasse erstellen, das ist ein Einstiegspunkt, um einen Stil zu erhalten. Hinweis: Sie dürfen Style="{StaticResource StyleName}" nicht mehr verwenden, aber Style="{StaticResource SomeStaticClass.StyleName}". Dies funktioniert nur, wenn Sie ein Qualitätsentwicklungsteam haben, das diese Arbeitsmethode gewohnt ist. Sie können die Anzahl der Zugriffe auf einen Stil während der Dauer des Programms zählen. Wenn nach langer Zeit die Style noch nicht benutzt wurde, ist es wahrscheinlich Kandidat, um loszuwerden.

+0

Interessant. Ich habe Item # 1, aber nicht zuverlässig, daher die Frage. Punkt # 3 ist eine gute Idee, aber würde es Fälle abdecken, in denen der Stil nicht explizit festgelegt wurde? Für Punkt 2 kann Snoop das vielleicht tun? – AMissico

+0

Ich konnte keinen Weg finden, Snoop zu benutzen. – AMissico

+0

Okay. Ich kenne mich nicht mit allen WPF-Werkzeugen aus. Ich werde morgen nachsehen, wenn ich im Büro bin. –

3

ReSharper zeigt toten Code. Obwohl sein Erkennungsalgorithmus nicht perfekt ist, ist es ein guter Anfang, so dass Sie jeden Stil überspringen können, den er als gebraucht anzeigt. Für jeden Stil, der als unbenutzt angezeigt wird, können Sie dann prüfen, ob er tatsächlich unbenutzt ist (z. B. durch Durchsuchen der Lösung).

+1

Funktioniert das auch für Xaml-Stile? Konnte es nicht finden. –

+1

Ich glaube nicht, dass ReSharper funktioniert. Ich verursachte absichtlich einen unbenutzten Stil, und es gab keinen Hinweis. – AMissico

+2

Der Erkennungsalgorithmus ist in der Tat nicht perfekt, der letzte, den ich verwendet habe, brach die Stile, die verwendet wurden. Unnötig zu sagen, dass sie nie so perfekt werden. Soweit OP-Frage geht, ist die Antwort nein, es gibt keinen zuverlässigen Weg :-). Es ist einfach nicht möglich, einfach so. Wie Patrick sagte, können die Styles zur Laufzeit geändert werden, wenn Ereignisse passieren, wenn Trigger passieren, etc etc .. Es ist nicht deterministisch. –

2

Unorthodox Weg dorthin zu bekommen wäre, eine angefügte Eigenschaft zu schaffen, das druckt, der die Control verwendet :) darüber nachdenken, es wie folgt aus:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna"> 
    <Style x:Key="invertedCheckBox" 
      TargetType="CheckBox"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="CheckBox"> 
       <Border my:WhoIsMyDaddy="true" ...> 

my:WhoIsMyDaddy eine angebaute Eigenschaft, die Propertyereignishandler auslöst sein könnte beim Initialisieren, wenn "true" eingestellt ist. Sobald der Handler aufgerufen wurde, können Sie auf die Instanz des Steuerelements zugreifen, das der Eigentümer der angefügten Eigenschaft ist. Am Ende einfach ausdrucken, was auch immer Sie wollen mit dieser Instanz.

+0

Interessant. Der einzige Nachteil ist, dass Sie jemals Kontrollkästchen Kontrolle ausüben müssen. – AMissico

+0

Was meinst du? –

+0

Ich müsste zu jedem Bildschirm gehen, der ein 'CheckBox' verwendet, um jedes Kontrollkästchen zu verwenden, um zu sehen, ob die Vorlage verwendet wird. Richtig? – AMissico

0

Nach dem, was Sie gesagt haben

Der Dateiname ‚CheckBoxTemplates ist.xaml 'und befindet sich in einer anderen Baugruppe als die Hauptanwendung. Beachten Sie, dass beim Suchen nach dem Dateinamen und dem Ressourcenschlüssel keine Ergebnisse angezeigt wurden.

können Sie sicher sein, dass dieser Stil nicht verwendet wird. Soweit ich weiß, gibt es kein automatisches Laden von XAML-Dateien (mit Ausnahme von Anwendungsressourcen und Designs) Bedeutet, es gibt keine Möglichkeit, dass irgendeine Kontrolle explizit oder implizit auf diesen Stil verweist (der scheinbar entladen wird - es sei denn, Sie haben etwas Code) hinter magic loading XAML-Dateien sowieso)