2012-05-10 20 views
7

L'interfaccia pubblica del controllo utente WPF contiene il metodo InitializeComponent generato automaticamente (contenuto in una classe parziale). È stata una sorpresa per me perché mi aspettavo che una cosa così interna fosse privata.Perché InitializeComponent è pubblico

C'è un modo per rimuovere InitializeComponent dall'interfaccia pubblica di controllo utente?

+0

Senza una chiamata a InitializeComponent XAML non otterrete analizzato – Sharun

+1

@Sharun, sì, ma non dovrebbe essere chiamato fuori del controllo – SiberianGuy

+1

@Sharun: E ' è chiamato all'interno del costruttore del controllo, non è vero? Quindi non deve essere pubblico ... –

risposta

6

InitializeComponent è un metodo definito sull'interfaccia System.Windows.Markup.IComponentConnector e viene utilizzato per il caricamento della pagina compilata di un componente.

Vedi MSDN estratto di sotto da questa link che ha più informazioni:

IComponentConnector viene utilizzato internamente da Baml2006Reader.

Le implementazioni di InitializeComponent sono ampiamente osservabili come parte dell'infrastruttura fornita da framework o tecnologie che utilizzano XAML combinato con i modelli di applicazione e di programmazione. Ad esempio, ogni volta che si guardano le classi generate per gli elementi radice XAML nelle pagine e nelle applicazioni WPF, nell'output verrà visualizzato InitializeComponent. Questo metodo esiste anche nell'assieme compilato e svolge un ruolo nel modello applicativo WPF di caricamento del contenuto dell'interfaccia utente XAML in tempo di analisi XAML (e suppongo quindi che InitializeComponent debba essere in un'interfaccia e sia pubblico in modo che altri assembly esterni di WPF possano farne uso).

Per spiegare questo ulteriore, passare alla definizione di InitializeComponent() metodo nella (diciamo): Window1.g.cs classe di esempio: WPFProject progetto, e cambiare il suo accesso da public a private

(mantenere il .es. il file cs aperta nel progetto altrimenti il ​​processo di compilazione sovrascrive il file, e non sarà in grado di vedere l'errore)

Ora, quando si compila il progetto WPF, getta un errore di compilazione, come di seguito:

Errore 22 'WPFProject.Window1' non implementa il membro di interfaccia 'System.Windows.Markup.IComponentConnector.InitializeComponent()'. 'WPFProject.Window1.InitializeComponent()' non può implementare un membro di interfaccia perché non è pubblico.

Inoltre, InitializeComponent() è contrassegnato con l'attributo [System.Diagnostics.DebuggerNonUserCodeAttribute()] così non si può entrare in questo metodo durante il debug.

C'è un altro SO QA discussion, che li aiuterebbe a spiegare più in dettaglio

+1

Più precisamente, il codice esterno può sempre effettuare la chiamata semplicemente lanciando l'oggetto al tipo di interfaccia. Implementare in modo esplicito InitializeComponent() in modo che sia privato non risolve quindi alcun problema. –

0

Ti sentiresti meglio se hai fatto il tuo controllo internal?

<UserControl 
    x:Class="PBbase.Client.Navigation.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:ClassModifier="internal"> 
+0

Ma ho bisogno di mantenere il controllo pubblico, voglio solo nascondere InitializeComponent – SiberianGuy

+0

@Idsa Nascondilo? Per quale ragione? – erodewald

+2

@Erode, per quale motivo dovrei tenerlo pubblico? – SiberianGuy

Problemi correlati