W WPF, jakie są różnice między atrybutami x: Name I Name?

Tytuł mówi wszystko. Czasami wydaje się, że atrybuty Name i x:Name są wymienne.

Więc, jakie są ostateczne różnice między nimi, i kiedy lepiej jest używać jednego nad drugim?

Czy są jakieś implikacje wydajności lub pamięci, aby używać ich w niewłaściwy sposób?

Author: Drew Noakes, 2009-02-26

14 answers

W XAML jest tylko jedna nazwa, x:Name. Framework, taki jak WPF, może opcjonalnie mapować jedną ze swoich właściwości do x:Name XAML używając RuntimeNamePropertyAttribute na klasie, która wyznacza jedną z właściwości klas jako mapowanie do atrybutu x: Name XAML.

Powodem tego było dopuszczenie frameworków, które mają już pojęcie "nazwa" w czasie wykonywania, takich jak WPF. Na przykład w WPF FrameworkElement wprowadza właściwość Name.

Ogólnie rzecz biorąc, klasa nie musi przechowywać nazwa x:Name aby była użyteczna. All x:Name means to XAML is generate a field to storage the value in the code behind class. To, co runtime robi z tym mapowaniem, zależy od struktury.

Więc dlaczego są dwa sposoby na zrobienie tego samego? Odpowiedź jest prosta, ponieważ istnieją dwa pojęcia odwzorowane na jednej właściwości. WPF chce, aby Nazwa elementu była zachowana w czasie wykonywania (co można wykorzystać m.in. poprzez Bind), a XAML musi wiedzieć, przez które elementy mają być dostępne pola w kodzie za klasą. WPF łączy je ze sobą, zaznaczając właściwość Name jako alias x: Name.

W przyszłości XAML będzie miał więcej zastosowań dla X: Name, takich jak możliwość ustawiania właściwości przez odwoływanie się do innych obiektów po nazwie, ale w wersji 3.5 i wcześniejszych jest używany tylko do tworzenia pól.

To, czy powinieneś używać jednego czy drugiego, jest tak naprawdę kwestią stylu, a nie techniczną. Pozostawiam to innym do rekomendacji.

Zobacz AutomationProperties.Name VS x: Name , AutomationProperties.Name jest używany przez narzędzia dostępności i niektóre narzędzia testujące.

 432
Author: chuckj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-15 19:49:53

To nie to samo.

x:Name jest koncepcją xaml, używaną głównie do odwoływania się do elementów. Gdy nadasz elementowi atrybut x: Name XAML, " podany x:Name staje się nazwą pola utworzonego w kodzie bazowym, gdy XAML jest przetwarzany, a to pole zawiera odniesienie do obiektu."(MSDN) jest to pole generowane przez projektanta, które domyślnie ma dostęp wewnętrzny.

Name jest istniejącą właściwością ciągu FrameworkElement, wymienioną jako każdy inny wpf właściwość elementu w postaci atrybutu xaml.

W konsekwencji oznacza to również, że x:Name może być używany na szerszym zakresie obiektów. Jest to technika pozwalająca na odwoływanie się do wszystkiego w xaml pod daną nazwą.

 73
Author: Kenan E. K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-25 20:16:05

X: Nazwa i nazwa odnoszą się do różnych przestrzeni nazw.

X: name jest odniesieniem do przestrzeni nazw x zdefiniowanej domyślnie na górze pliku Xaml.

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Po prostu mówiąc Nazwa używa domyślnej przestrzeni nazw poniżej.

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

X: Nazwa {[9] } mówi o używaniu przestrzeni nazw, która ma alias x. x jest domyślne i większość ludzi go zostawia, ale możesz go zmienić na cokolwiek chcesz

xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"

Więc twoje odniesienie będzie foo: nazwa

Definiowanie i używanie przestrzeni nazw w WPF


OK spójrzmy na to inaczej. Powiedzmy, że przeciągasz i upuszczasz przycisk na stronę Xaml. Możesz odwołać się do tego 2 sposoby x: nazwa i Nazwa . All xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" oraz xmlns: x="http://schemas.microsoft.com/winfx/2006/xaml" are to odwołania do wielu przestrzeni nazw. Ponieważ XAML posiada Control namespace(Nie w 100% na to) i presentation przechowuje Framework i Button class ma wzór dziedziczenia:

Button : ButtonBase
ButtonBase : ContentControl, ICommandSource
ContentControl : Control, IAddChild
Control : FrameworkElement
FrameworkElement : UIElement, IFrameworkInputElement, 
                    IInputElement, ISupportInitialize, IHaveResources

Więc można by oczekiwać, że wszystko, co dziedziczy z frameworku, będzie miało dostęp do wszystkich jego publicznych atrybutów. Tak więc w przypadku Buttona otrzymuje on swój atrybut Name Z frameworka, na samym szczycie drzewa hierarchii. więc można powiedzieć x: Nazwa lub Nazwa i oba będą uzyskiwać dostęp do gettera/settera z frameworka.

MSDN Reference

WPF definiuje atrybut CLR, który jest używany przez procesory XAML w celu mapowania wielu przestrzeni nazw CLR do pojedynczej przestrzeni nazw XML. Atrybut xmlnsdefinitionattribute jest umieszczony na poziomie asemblacji w kodzie źródłowym, który tworzy asemblację. Kod źródłowy zestawu WPF używa tego atrybutu do mapowania różnych wspólnych przestrzeni nazw, takich jak System.Okna i System.Okna.Kontrolki, do http://schemas.microsoft.com/winfx/2006/xaml/presentation przestrzeń nazw.

Więc atrybuty assembly będą wyglądać tak:

PresentationFramework.dll-XmlnsDefinitionAttribute:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Data")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Navigation")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Shapes")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Documents")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Controls")]  
 31
Author: cgreeno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-15 19:51:10

Oba są tym samym, wiele elementów frameworku ujawnia właściwość name, ale dla tych, którzy tego nie robią, możesz użyć x:name - Zwykle trzymam się x: name, ponieważ działa na wszystko.

Kontrolki mogą ujawnić nazwę jako właściwość zależności, jeśli chcą (ponieważ muszą używać tej właściwości wewnętrznie), lub mogą tego nie robić.

Więcej szczegółów w msdn tutaj i tutaj:

Niektóre WPF aplikacje na poziomie ramowym może być w stanie uniknąć jakiegokolwiek wykorzystania x: atrybut Name, ponieważ nazwa właściwość zależności określona w przestrzeni nazw WPF dla kilku z ważnych klas bazowych, takich jak Framework / FrameworkContentElement spełnia ten sam cel. Są jeszcze jakieś wspólne XAML i framework scenariusze, w których kod dostępu do element bez właściwości Name jest konieczne, zwłaszcza w niektórych obsługa animacji i storyboardu klasy. Na przykład, powinieneś podaj x: Name na osi czasu i przekształceń utworzonych w XAML, jeśli / align= "left" /

Jeśli nazwa jest dostępna jako nieruchomość na Klasa, Nazwa i X: Nazwa mogą być użyte zamiennie jako atrybuty, ale błąd spowoduje, jeśli oba są określone na tym samym elemencie.

 19
Author: Steven Robbins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-15 19:52:35

X: Name może powodować problemy z pamięcią, jeśli masz niestandardowe kontrolki. Zachowa miejsce pamięci dla wpisu NameScope.

Mówię, nigdy nie używaj x: Name, chyba że musisz.

 9
Author: scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-13 18:57:33

Jedyna różnica polega na tym, że jeśli używasz kontrolek użytkownika do kontrolki z tego samego zestawu, to Name Nie zidentyfikuje Twojej kontrolki i pojawi się błąd "użyj X: Nazwa kontrolek w tym samym zestawie". So x: Name jest wersjonowaniem WPF kontrolek nazewnictwa w WPF. Nazwa jest po prostu używana jako dziedzictwo Winform. Chcieli odróżnić nazwy kontrolek w WPF i winforms, ponieważ używają atrybutów w Xaml do identyfikacji kontrolek z innych zestawów, których używali x: Do nazw kontrolek.

Po prostu należy pamiętać dont umieścić nazwę dla kontroli tylko ze względu na utrzymanie go jako rezyduje w pamięci jako puste i to daje ostrzeżenie, że nazwa została zastosowana do kontroli, ale jego nigdy nie używane.

 7
Author: Bipul Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 18:03:57

Nazwa :

  1. może być używany tylko dla potomków FrameworkElement i FrameworkContentElement;
  2. można ustawić z kodu za pomocą SetValue () i właściwości podobnych.

X: Nazwa :

  1. może być używany dla prawie wszystkich elementów XAML;
  2. nie można ustawić z kod-za pomocą SetValue(); może być ustawiony tylko przy użyciu atrybutu składni na obiektach, ponieważ jest to dyrektywa.

Używanie obu dyrektyw w XAML dla jednego frameworka lub FrameworkContentElement spowoduje wyjątek: jeśli XAML jest kompilowany, wyjątek pojawi się podczas kompilacji znaczników, w przeciwnym razie wystąpi podczas ładowania.

 7
Author: Alexander Zolotaryov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 17:12:05

x:Name oznacza: Utwórz pole w kodzie z tyłu, aby zawierało odniesienie do tego obiektu.

Name znaczy: ustaw właściwość name tego obiektu.

 5
Author: BIBIN K ONANKUNJU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-12 07:15:04

Zawsze używam wariantu nazwy x:. Nie mam pojęcia, czy ma to wpływ na wydajność, po prostu uważam, że jest to łatwiejsze z następujących powodów. Jeśli masz własne kontrolki usercontrols, które znajdują się w innym zestawie, właściwość "Name" nie zawsze wystarczy. Ułatwia to również przyklejenie właściwości x: Name.

 4
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 09:56:56

Nie jest to element WPF, ale standardowy XML i BtBh poprawnie odpowiedział, X odnosi się do domyślnej przestrzeni nazw. W XML, gdy nie prefiks elementu / atrybutu z przestrzeni nazw zakłada, że chcesz domyślną przestrzeń nazw. Więc pisanie po prostu Name jest niczym więcej niż krótką ręką dla x:Name. Więcej szczegółów na temat przestrzeni nazw XML można znaleźć w link text

 3
Author: Robert MacLean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:20

Jedną z odpowiedzi jest to, że x: name ma być używane w różnych językach programowania, takich jak c# , a name ma być używane dla frameworka. Szczerze mówiąc, tak to brzmi.

 2
Author: daddycardona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-15 05:49:48

Kiedy deklarujesz element Button w XAML, odnosisz się do klasy zdefiniowanej w Windows run time o nazwie Button.

Przycisk ma wiele atrybutów, takich jak tło, tekst, margines,..... i atrybut o nazwie Name.

Teraz, kiedy deklarujesz przycisk w XAML, jest jak tworzenie anonimowego obiektu, który miał atrybut Name.

Ogólnie nie można odnosić się do obiektu anonimowego, ale w frameworku WPF procesor XAML umożliwia odnowienie się do tego obiektu przez jakąkolwiek wartość podałeś do nazwy atrybutu.

Jak na razie dobrze.

Innym sposobem tworzenia obiektu jest utworzenie obiektu nazwanego zamiast obiektu anonimowego. W tym przypadku przestrzeń nazw XAML ma atrybut dla obiektu o nazwie Name (a ponieważ znajduje się on w przestrzeni nazw XAML, więc masz X:), który możesz ustawić, abyś mógł zidentyfikować swój obiekt i odnieść się do niego.

Wniosek:

Name jest atrybutem określonego obiektu, ale X: Name jest jednym z atrybutów tego obiektu (istnieje klasa, która definiuje ogólny obiekt).

 2
Author: RockyMan Rocky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 02:10:55

Podany x: Name staje się nazwą pola utworzonego w kodzie bazowym podczas przetwarzania XAML, a to pole zawiera odniesienie do obiektu. W Silverlight, korzystając z managed API, proces tworzenia tego pola jest wykonywany przez kroki docelowe MSBuild, które są również odpowiedzialne za łączenie klas częściowych dla pliku XAML i jego kodu. Zachowanie to niekoniecznie jest określone w języku XAML; jest to szczególna implementacja, która Silverlight stosuje użycie x: Name w swoich modelach programowania i aplikacji.

Czytaj więcej na MSDN...

 1
Author: Edd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 15:47:29

Moje badania są x:Name jakoglobalne zmienne. Jednak Name jako lokalna zmienna. Czy to oznacza, że x: Name można go nazwać w dowolnym miejscu w pliku XAML, ale nazwa nie jest.
Przykład:

<StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
<Button Content="Example" Name="btn" />
</StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />

Nie możesz Binding własności Content z Button z nazwą jest "btn", ponieważ poza StackPanel

 0
Author: Phuc Hoang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 12:36:51