it-swarm.com.de

Ist es möglich, Code hinter einem Ressourcenwörterbuch in WPF für die Ereignisbehandlung festzulegen?

Ist es möglich, Code hinter einem Ressourcenwörterbuch in WPF festzulegen? Beispielsweise deklarieren Sie in einem Benutzersteuerelement für eine Schaltfläche es in XAML. Der Ereignishandhabungscode für den Tastenklick wird in der Codedatei hinter dem Steuerelement vorgenommen. Wenn ich eine Datenvorlage mit einer Schaltfläche erstellen wollte, wie kann ich den Ereignishandlercode für den Schaltflächenklick innerhalb des Ressourcenwörterbuchs schreiben.

143
Crippeoblade

Ich denke, was Sie fragen, ist, dass Sie eine Code-Behind-Datei für ein ResourceDictionary wollen. Das kannst du voll und ganz! In der Tat machen Sie es genauso wie für ein Fenster:

Angenommen, Sie haben ein ResourceDictionary mit dem Namen MyResourceDictionary. Fügen Sie in Ihrer MyResourceDictionary.xaml-Datei das x: Class-Attribut wie folgt in das Stammelement ein:

<ResourceDictionary xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
                    x:Class="MyCompany.MyProject.MyResourceDictionary"
                    x:ClassModifier="public">

Erstellen Sie dann einen Code hinter der Datei MyResourceDictionary.xaml.cs mit der folgenden Deklaration:

namespace MyCompany.MyProject
{
    partial class MyResourceDictionary : ResourceDictionary
    { 
       public MyResourceDictionary()
       {
          InitializeComponent();
       }     
       ... // event handlers ahead..
    }
}

Und du bist fertig. Sie können alles in den Code einfügen, was Sie möchten: Methoden, Eigenschaften und Ereignishandler.

== Update für Windows 10 Apps ==

Und nur für den Fall, dass Sie mit UWP spielen, gibt es noch eine Sache, die Sie beachten sollten:

<Application x:Class="SampleProject.App"
             xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
             xmlns:rd="using:MyCompany.MyProject">
<!-- no need in x:ClassModifier="public" in the header above -->

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>

                <!-- This will NOT work -->
                <!-- <ResourceDictionary Source="/MyResourceDictionary.xaml" />-->

                <!-- Create instance of your custom dictionary instead of the above source reference -->
                <rd:MyResourceDictionary />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>
204
ageektrapped

Ich bin nicht einverstanden mit "ageektrapped" ... die Verwendung der Methode einer Teilklasse ist keine gute Praxis. Was wäre dann der Zweck, das Wörterbuch von der Seite zu trennen?

Von einem Code-Behind aus können Sie auf ein x: Name-Element zugreifen, indem Sie Folgendes verwenden:

Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
   ...
}

Sie können this in der OnApplyTemplate-Methode ausführen, wenn Sie eine Verbindung zu Steuerelementen herstellen möchten, wenn Ihr benutzerdefiniertes Steuerelement geladen wird. OnApplyTemplate muss dazu überschrieben werden. Dies ist eine gängige Praxis und ermöglicht es Ihrem Stil, von der Steuerung getrennt zu bleiben. (Der Stil sollte nicht vom Steuerelement abhängen, aber das Steuerelement sollte von einem Stil abhängen.).

9
Phobis

Gishu - obwohl dies eine "im Allgemeinen nicht zu ermutigende Übung" zu sein scheint. Hier ist ein Grund, warum Sie es vielleicht tun möchten:

Das Standardverhalten für Textfelder, wenn sie den Fokus erhalten, besteht darin, dass das Caret an derselben Position platziert wird, an der es war, als das Steuerelement den Fokus verlor. Wenn Sie es in Ihrer gesamten Anwendung vorziehen würden, den gesamten Inhalt des Textfelds zu markieren, wenn der Benutzer auf ein Textfeld tippt, wäre das Hinzufügen eines einfachen Handlers im Ressourcenwörterbuch ausreichend.

Jeder andere Grund, aus dem Sie möchten, dass sich das Standardverhalten der Benutzerinteraktion vom Standardverhalten unterscheidet, scheint ein guter Kandidat für einen Code in einem Ressourcenwörterbuch zu sein.

Stimmen Sie voll und ganz zu, dass sich alles, was für die Anwendungsfunktionalität spezifisch ist, nicht in einem Code hinter einem Ressourcenwörterbuch befinden sollte.

5
Pete Maher

XAML dient zum Erstellen von Objektdiagrammen, die keinen Code enthalten.
Eine Datenvorlage wird verwendet, um anzugeben, wie ein benutzerdefiniertes Benutzerobjekt auf dem Bildschirm gerendert werden soll ... (z. B. wenn es sich um ein Listenfeldelement handelt) Das Verhalten gehört nicht zum Fachgebiet einer Datenvorlage. Die Lösung neu zeichnen ...

0
Gishu