it-swarm.it

È possibile impostare il codice dietro un dizionario di risorse in WPF per la gestione degli eventi?

È possibile impostare il codice dietro un dizionario di risorse in WPF. Ad esempio in un controllo utente per un pulsante lo dichiari in XAML. Il codice di gestione degli eventi per il clic sul pulsante viene eseguito nel file di codice dietro il controllo. Se dovessi creare un modello di dati con un pulsante come posso scrivere il codice del gestore eventi per il relativo pulsante fare clic nel dizionario delle risorse.

143
Crippeoblade

Penso che quello che stai chiedendo sia che desideri un file code-behind per un ResourceDictionary. Puoi farlo totalmente! In effetti, lo fai allo stesso modo di una finestra:

Supponi di avere un ResourceDictionary chiamato MyResourceDictionary. Nel tuo file MyResourceDictionary.xaml, inserisci l'attributo x: Class nell'elemento root, in questo modo:

<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">

Quindi, crea un codice dietro il file chiamato MyResourceDictionary.xaml.cs con la seguente dichiarazione:

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

E hai finito. Puoi inserire ciò che desideri nel codice: metodi, proprietà e gestori di eventi.

== Aggiornamento per le app di Windows 10 ==

E nel caso in cui stai giocando con UWP c'è un'altra cosa da tenere presente:

<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

Non sono d'accordo con "ageektrapped" ... l'uso del metodo di una classe parziale non è una buona pratica. Quale sarebbe lo scopo di separare il Dizionario dalla pagina allora?

Da un code-behind, puoi accedere a un elemento x: Name usando:

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

È possibile eseguire this nel metodo OnApplyTemplate se si desidera collegarsi ai controlli quando viene caricato il controllo personalizzato. OnApplyTemplate deve essere ignorato per fare questo. Questa è una pratica comune e consente al tuo stile di rimanere disconnesso dal controllo. (Lo stile non dovrebbe dipendere dal controllo, ma il controllo dovrebbe dipendere dall'avere uno stile).

9
Phobis

Gishu - anche se questa potrebbe sembrare una "pratica generalmente non incoraggiata" Ecco una ragione per cui potresti voler farlo:

Il comportamento standard per le caselle di testo quando ottengono lo stato attivo è che il cursore venga posizionato nella stessa posizione in cui si trovava quando il controllo perse lo stato attivo. Se preferisci in tutta la tua applicazione che quando l'utente accede a qualsiasi casella di testo che è stato evidenziato l'intero contenuto della casella di testo, l'aggiunta di un semplice gestore nel dizionario delle risorse farebbe il trucco.

Qualsiasi altro motivo per cui si desidera che il comportamento di interazione dell'utente predefinito sia diverso dal comportamento predefinito sembra un buon candidato per un codice in un dizionario delle risorse.

Sono totalmente d'accordo sul fatto che tutto ciò che è specifico della funzionalità dell'applicazione non dovrebbe essere in un codice dietro un dizionario di risorse.

5
Pete Maher

XAML serve per costruire grafici di oggetti che non contengono codice.
Un modello di dati viene utilizzato per indicare come un oggetto utente personalizzato deve essere visualizzato sullo schermo ... (ad esempio se si tratta di un elemento della casella di riepilogo) il comportamento non fa parte dell'area di competenza di un modello di dati. Ridisegna la soluzione ...

0
Gishu