Qual è la differenza tra x: Reference e ElementName?

In base alla pagina x: Reference Markup Extension su MSDN, x:Reference

Fa riferimento a un’istanza che è stata dichiarata altrove nel markup XAML. Il riferimento si riferisce a x di un elemento: Nome.

In base alla pagina Proprietà Binding.ElementName su MSDN, ElementName

Il valore della proprietà Name o x: Name Directive dell’elemento di interesse.

Guardando indietro alla sezione commenti sulla prima pagina:

x: riferimento e WPF

In WPF e XAML 2006, i riferimenti agli elementi sono indirizzati dalla funzionalità a livello di framework del collegamento ElementName. Per la maggior parte delle applicazioni e degli scenari WPF, è comunque necessario utilizzare il collegamento ElementName. Eccezioni a questa guida generale potrebbero includere casi in cui esistono dati contestuali o altre considerazioni sull’ambito dell’ambito che rendono impraticabile l’associazione dei dati e in cui la compilazione del markup non è coinvolta.

Per completezza, qui fa parte della sezione commenti sulla pagina ElementName :

Questa proprietà è utile quando si desidera associare la proprietà di un altro elemento nell’applicazione. Ad esempio, se si desidera utilizzare un dispositivo di scorrimento per controllare l’altezza di un altro controllo nell’applicazione o se si desidera associare il contenuto del controllo alla proprietà SelectedValue del controllo ListBox.

Ora, mentre sono pienamente consapevole di quando e come utilizzare la proprietà ElementName , non comprendo appieno la differenza tra questo e l’estensione x:Reference markup. Qualcuno può spiegare questo e in particolare, espandere l’ultima frase mostrata nella sezione x:Reference ?:

Eccezioni a questa guida generale potrebbero includere casi in cui esistono dati contestuali o altre considerazioni sull’ambito dell’ambito che rendono impraticabile l’associazione dei dati e in cui la compilazione del markup non è coinvolta.

Fondamentalmente, come hai detto tu, quei due fanno quasi la stessa cosa. Tuttavia ci sono piccole differenze nel cofano.

{x:Reference ...} -> restituisce solo un riferimento di un object che non crea quel “ponte” tra due proprietà come il legame farebbe. Dietro a tutto ciò viene utilizzato un servizio che cerca il nome specificato in un ambito specifico che di solito è la finestra stessa.

{Binding ElementName="..." } -> prima di tutto crea quell’object vincolante, quindi cerca il nome dell’object ma non usando la stessa tecnica sotto il cofano come x: Reference. L’algoritmo di ricerca si sposta verso l’alto e / o verso il basso in VisualTree per trovare l’elemento desiderato. Pertanto è sempre necessario un VisualTree funzionale. Ad esempio se usato all’interno di un non-UiElement, non funzionerà. Alla fine il legame rimane e fa il suo pane quotidiano.

Questo non funzionerà:

      .... 

Questo funziona:

      .... 

Un po ‘come quello 🙂

ElementName è specifico per piattaforma. Vale a dire potrebbe essere o non essere presente in base alla piattaforma che stai utilizzando. x: Reference eleva tale concetto a una funzione nativa XAML. Pertanto qualsiasi piattaforma che supporti XAML supporta x: Reference.