WPF'de, x: Ad ve Ad öznitelikleri arasındaki farklar nelerdir?


574

Başlık her şeyi söylüyor. Bazen Nameve x:Nameözniteliklerinin birbirinin yerine geçebileceği görülmektedir.

Peki, aralarındaki kesin farklar nelerdir ve ne zaman diğerinin üzerinde kullanılması tercih edilir?

Bunları yanlış kullanmanın herhangi bir performans veya bellek etkisi var mı?


Yanıtlar x:Nameher zaman kullanmanın iyi çalıştığını göstermektedir. Ben sadece bunu değiştirmek zorunda kaldı Nameaksi takdirde benim her zaman iyi çalışır durumda olmadığını varsayacağım bu yüzden benim .xaml.cs kodunda kontrol referans olamazdı.
Ortund

1
Geri dönüşünüzle ilgili olarak, "başlık her şeyi söylüyor" ifadesiyle hangi ek anlam ifade edilir, Drew? Gereksiz değil mi? (Düzenleme nedenim, konuşmacı dolgu ifadelerini caydırma eğilimimdir - bu, "Bana yardım edip edemeyeceğinizi merak ediyorum" dan daha bilgilendirici değil).
halfer

Yanıtlar:


481

XAML'de gerçekten sadece bir isim var x:Name. WPF gibi bir çerçeve, sınıf özelliklerinden birini XAML'nin x: Name özniteliğine eşleme olarak atayan sınıfı x:Namekullanarak, isteğe bağlı olarak özelliklerinden birini XAML'lerle eşleyebilir RuntimeNamePropertyAttribute.

Bunun yapılmasının nedeni, çalışma zamanında WPF gibi bir "Ad" kavramı olan çerçevelere izin vermektir. WPF'de, örneğin, FrameworkElementbir Name özelliği sunar.

Genel olarak, bir sınıfın x:Namekullanılabilir olması için adı saklaması gerekmez . Tüm x:NameXAML araçları sınıfı kodda değeri saklamak için bir alan oluşturmak,. Çalışma zamanının bu eşleme ile yaptığı şey çerçeveye bağlıdır.

Peki, neden aynı şeyi yapmanın iki yolu var? Bunun basit cevabı, bir mülke eşlenmiş iki kavram olmasıdır. WPF, çalışma zamanında korunan bir öğenin adını ister (diğer şeylerin yanı sıra Bind aracılığıyla kullanılabilir) ve XAML'nin sınıfın arkasındaki koddaki alanlardan hangi öğelere erişmek istediğinizi bilmesi gerekir. WPF, Name özelliğini x: Name'in diğer adı olarak işaretleyerek bu ikisini birbirine bağlar.

Gelecekte, XAML'nin x: Name için daha fazla kullanımı olacaktır; örneğin, diğer nesnelere ada göre başvurarak özellikleri ayarlamanıza izin verir, ancak 3.5 ve öncesinde, yalnızca alan oluşturmak için kullanılır.

Bunlardan birini mi yoksa diğerini mi kullanmanız gerektiği teknik bir soru değil, gerçekten bir stil sorusudur. Bir tavsiye için başkalarına bırakacağım.

Ayrıca bkz. AutomationProperties.Name VS x: Name , AutomationProperties.Name erişilebilirlik araçları ve bazı test araçları tarafından kullanılır.


2
Visual Studio 2010'da, XAML'yi tasarımcı aracılığıyla düzenlediğinizde Name özelliği ayarlanır (x: Name değil). MS, x: Name üzerinde Name kullanımını teşvik ediyormuş gibi görünüyor, bu yüzden sanırım bu standart.
Nebula

11
İkisinin genel olarak birbirinin yerine geçebileceğini sanmıyorum. Adlandırma kullanıcı kontrolleri gerektirir x:Nameçünkü Namekod arkasında tanınan edilecek bir alan oluşturmak olmaz. Yine de bunun neden olduğunu hala bilmiyorum.
Libor

5
Öyle demek istemedim, demek istemedim. WPF'de, bir öğenin bir Nameözelliği varsa aynı anlama gelir. Öğenin bir Nameözelliği yoksa kullanmanız gerekir x:Name.
chuckj

90

Aynı şey değiller.

x:Namexaml, esas olarak referans elemanlarına kullanılan bir xaml konseptidir. Bir öğeye x: Name xaml özniteliğini verdiğinizde, "belirtilen x:Name, xaml işlendiğinde temel kodda oluşturulan bir alanın adı olur ve bu alan nesneye başvuru içerir." ( MSDN ) Bu, varsayılan olarak dahili erişime sahip, tasarımcı tarafından oluşturulan bir alandır.

Name, FrameworkElementxaml özniteliği biçiminde başka bir wpf öğesi özelliği olarak listelenen a'nın varolan dize özelliğidir .

Sonuç olarak, bu aynı zamanda x:Namedaha geniş bir nesne aralığında kullanılabileceği anlamına gelir . Bu, xaml içindeki herhangi bir şeyin belirli bir adla referans alınmasını sağlayan bir tekniktir.


6
Öyleyse neden Name veya x: Name, Binding.ElementName ile kullanılabilir? Görünüşe göre x: Name özniteliği yalnızca oluşturulan koddaki bir alanı adlandırmak için değil, aynı zamanda çalışma zamanında meta verilerde de kullanılabilir.
Drew Noakes

WinForms düzenleyicisinin Tasarım özelliklerinde Ad alanı gibi oluşturulan bir alandır. Orada özellik listesine bir ad koyarsınız ve bu alanın adı olur. Bu aynı davranıştır. Tabii ki arka planda kod içine derlenmiş bir iç alan olduğundan çalışma zamanında kullanılabilir. Binding.ElementName her iki durumu da denetler, yani xaml editörü "magic", x: Name kendi içinde büyülü değildir.
Kenan EK

39

x: Ad ve Ad farklı ad alanlarına başvuruyor.

x: name , Xaml dosyasının üstünde varsayılan olarak tanımlanan x ad alanına yapılan bir başvurudur.

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

Sadece Name adında varsayılan ad alanını kullanır.

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

x: Name , x diğer adı olan ad alanını kullandığını söylüyor . x varsayılan ayardır ve çoğu kişi onu terk eder, ancak istediğiniz gibi değiştirebilirsiniz

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

yani referans foo: isim olurdu

WPF'de Ad Alanlarını Tanımlama ve Kullanma


Tamam buna farklı bir şekilde bakalım. Diyelim ki Xaml sayfanıza bir düğmeyi sürükleyip bırakın. Bu iki yoldan bahsedebilirsiniz: x: ad ve ad . Tüm xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" ve xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" birden çok ad alanına referanstır . Yana xaml tutan Kontrol (bu konuda değil% 100) ad ve sunum tutan FrameworkElement VE Button sınıfı bir miras modeli vardır:

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

Dolayısıyla, FrameworkElement'den devralınan her şeyin tüm genel özelliklerine erişebileceği gibi. Button durumunda, Name özniteliğini hiyerarşi ağacının en üstündeki FrameworkElement öğesinden alıyor. Yani x: Name veya Name diyebilirsiniz ve her ikisi de FrameworkElement öğesinden alıcıya / ayarlayıcıya erişecektir.

MSDN Başvurusu

WPF, birden çok CLR ad alanını tek bir XML ad alanına eşlemek için XAML işlemcileri tarafından tüketilen bir CLR özniteliğini tanımlar. XmlnsDefinitionAttribute özelliği, montaj üreten kaynak kodunda montaj seviyesinde yerleştirilmiştir. WPF derleme kaynak kodu, bu özniteliği System.Windows ve System.Windows.Controls gibi çeşitli ortak ad alanlarını http://schemas.microsoft.com/winfx/2006/xaml/presentation ad alanına eşlemek için kullanır .

Derleme öznitelikleri şöyle görünecektir:

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

1
Bunun doğru olduğunu sanmıyorum http://schemas.microsoft.com/winfx/2006/xamltutan Control: 'x' ad vermeden doğrudan XAML kullanabilirsiniz beri<Control />
Drew Noakes

23

Her ikisi de aynı şeydir, birçok çerçeve öğesi bir ad özelliğini kendileri ortaya çıkarır, ancak kullanmayanlar için x: name'i kullanabilirsiniz - Genellikle her şey için çalıştığı için x: name ile yapışırım.

Denetimler istedikleri takdirde kendilerini bir Bağımlılık Özelliği olarak gösterebilirler (çünkü bu Bağımlılık Özelliğini dahili olarak kullanmaları gerekir) veya yapmamayı seçebilirler.

Burada ve burada msdn'de daha fazla ayrıntı :

Bazı WPF çerçeve düzeyindeki uygulamalar x: Name özniteliğinin herhangi bir şekilde kullanılmasını engelleyebilir, çünkü FrameworkElement / FrameworkContentElement gibi önemli temel sınıfların birçoğu için WPF ad alanında belirtilen Ad bağımlılığı özelliği aynı amacı yerine getirir. Özellikle belirli animasyon ve film şeridi destek sınıflarında, Name özelliği olmayan bir öğeye kod erişiminin gerekli olduğu bazı yaygın XAML ve çerçeve senaryoları vardır. Örneğin, koddan referans almak istiyorsanız XAML'de oluşturulan zaman çizelgeleri ve dönüşümlerde x: Name belirtmelisiniz.

Sınıfta bir özellik olarak Ad varsa, Ad ve x: Ad öznitelikler olarak birbirinin yerine kullanılabilir, ancak aynı öğede her ikisi de belirtilirse bir hata oluşur.


4
Fark yoksa, neden aynı şeyi yapmanın iki yolu olabilir? WPF'nin ilk sürümünde her iki yol da vardı.
Drew Noakes

@Steve, şimdiye kadar hiçbiri çok uygun olmasa da, bu soruya verilen cevapların hiçbirini küçümsemedim.
Drew Noakes

Size sadece yanıtı vermekle kalmayıp, konuyla ilgili daha fazla bilgi için MSDN'ye bağlantılar veren bir cevabın uygun olmadığını nasıl görüyorum? :-)
Steven Robbins

5
@Steve orijinal cevabım sorumu ele almadı, dolayısıyla yorumum. Kör inanç için "bu şekilde yap" değil, bunlardan biri sürekli çalışıyor olsa bile neden iki yolun var olduğunu açıklayan anlayışlı bir cevap arıyorum. Teknik olarak doğru! = Uygun. Güncellemeniz çok daha iyi.
Drew Noakes

1
Burada da aynı yanıt var: wpfwiki.com/WPF%20Q16.4.ashx x: Ad, kontrole arka planda kod için kullanılacak bir ad veriyor. Bazı sınıflar aynı amaç için bir Ad özelliği sağlar. Bu sınıflar için, x: name ve name arasında bir fark yoktur.
Vegar

11

X: Özel denetimleriniz varsa ad bellek sorunlarına neden olabilir. NameScope girişi için bir bellek yeri tutacaktır.

Zorunlu olmadıkça asla x: Name kullanmayın diyorum.


Kabul. Çok sayıda bellek sızıntısı olan bir kiosk uygulamasında çalıştı ve önceki dev ekibinin kararı sadece yeniden başlatmaya zorlamaktı. Sızıntıların çoğu kolayca belirlendi. Yine de, IntelliTrace ve JustTrace aracılığıyla bulunanları düzelttikten sonra, bazı referanslar hala örtük ve açık çöp toplamadan kaçındı. Şunu okudum: support.scichart.com/index.php?/News/NewsItem/View/21/… x: Ad azaltmanın performansı daha da artırdığını gördüm .
MachinusX

2
O benim bu etkiler anlamak hem Adı ve x: Adı hem NameScope eklendikçe. Öğenizde bir Ad'a ihtiyacınız varsa, etrafında bir şey yoktur. Adsız bir öğenin kodunu kullanarak yeniden oluşturabilirsiniz FrameworkElement.RegisterName("elementname"). Ancak, çağırırsanız FrameworkElement.UnregisterName("elementname")"kayıttan kaldırılabilir".
Adam Caviness

8

Tek fark, Kullanıcı Denetimlerini Aynı Derlemeden bir denetime kullanıyorsanız, Ad'ın denetiminizi tanımlamaması ve "Aynı Derlemedeki denetimler için x Kullan: Ad" hatası alırsınız. Yani x: Ad, WPF'deki adlandırma denetimlerinin WPF sürümlemesidir. Adı sadece Winform Legacy olarak kullanılır. WPF'deki kontrollerin adlarını ve Winform'ları, xaml'deki öznitelikleri kullandıkları için kontrolleri tanımlamak için kullandıkları diğer montajlardan x: kontrol adları için ayırmak istediler.

Sadece bir bellek için boş olarak bulunduğu gibi tutmak için bir kontrol için bir isim koymayın ve size bir kontrol için uygulandığını ancak asla kullanılmadığını gösteren bir uyarı verecektir.


8

İsim :

  1. yalnızca FrameworkElement ve FrameworkContentElement'in torunları için kullanılabilir;
  2. SetValue () ve özellik benzeri aracılığıyla arkadaki koddan ayarlanabilir.

x: İsim :

  1. hemen hemen tüm XAML elemanları için kullanılabilir;
  2. SetValue () ile arkadaki koddan ayarlanamaz; yalnızca bir yönerge olduğu için nesneler üzerinde öznitelik sözdizimi kullanılarak ayarlanabilir.

Bir FrameworkElement veya FrameworkContentElement için XAML'de her iki yönergeyi kullanmak da bir istisnaya neden olur: XAML biçimlendirme derlenmişse, istisna biçimlendirme derlemesinde gerçekleşir, aksi takdirde yükte oluşur.


7

x:Name şu anlama gelir: bu nesneye bir referans tutmak için arkadaki kodda bir alan oluşturun.

Name anlamı: bu nesnenin name özelliğini ayarlayın.


Bu tam olarak doğru değil; her ikisine de kod arkasından erişilebilir, ancak ilginç bir şekilde yalnızca x: Adı çalışma zamanında güncellenebilir. Çatlak.

4

Her zaman x: Name varyantını kullanırım. Bunun herhangi bir performansı etkileyip etkilemediğine dair hiçbir fikrim yok, sadece aşağıdaki sebepten daha kolay buluyorum. Başka bir derlemede bulunan kendi kullanıcı denetimleriniz varsa, yalnızca "Ad" özelliği her zaman yeterli olmaz. Bu da x: Name özelliğinin yapıştırılmasını kolaylaştırır.


4
Fark yoksa, neden aynı şeyi yapmanın iki yolu olabilir? WPF'nin ilk sürümünde her iki yol da vardı.
Drew Noakes

3

Bu bir WPF öğesi değil, standart bir XML ve BtBh öğesinin doğru yanıt verdiğini, x varsayılan ad alanını ifade eder. XML'de, bir öğe / özniteliğin ad alanı önekini eklemediğinizde, varsayılan ad alanını istediğinizi varsayar. Yani yazmak sadece Namekısa bir elden başka bir şey değildir x:Name. XML ad alanlarıyla ilgili daha fazla ayrıntı bağlantı metninde bulunabilir


-1 x: 'e ayarlı, farklı bir XML ad alanı anlamına gelir, doğru, ama bu aslında Q için yararlı bir cevap değil, ne zaman diğerini kullanmanız gerektiğine dair. : /
Tim Lovell-Smith

2

Yanıtlardan biri, x: adının c # gibi farklı program dillerinde kullanılması ve çerçeve için adın kullanılmasıdır. Dürüst olmak gerekirse bana öyle geliyor.


2

Belirtilen x: Ad , XAML işlendiğinde temel kodda oluşturulan bir alanın adı olur ve bu alan nesneye başvuru içerir. Silverlight'ta, yönetilen API'yi kullanarak bu alanı oluşturma işlemi, bir XAML dosyası ve arkasındaki kodun kısmi sınıflarına katılmaktan sorumlu olan MSBuild hedef adımları tarafından gerçekleştirilir. Bu davranış mutlaka XAML dili belirtilmez; Silverlight'ın programlama ve uygulama modellerinde x: Name kullanımı için geçerli olduğu özel bir uygulamadır .

MSDN'de Daha Fazla Bilgi ...


2

XAML'de bir Button öğesi bildirdiğinizde, Button adlı Windows çalışma zamanında tanımlanan bir sınıfa başvuruyorsunuz.

Düğme, arka plan, metin, kenar boşluğu, ..... gibi birçok özelliğe ve Ad adlı bir özelliğe sahiptir.

XAML'de bir Düğme bildirdiğinizde, Name adlı bir özniteliğe sahip olan anonim bir nesne oluşturmak gibidir.

Genel olarak anonim bir nesneye başvuramazsınız, ancak WPF çerçevesinde XAML işlemci, Name özniteliğine verdiğiniz herhangi bir değerle bu nesneye başvurmanızı sağlar.

Çok uzak çok iyi.

Nesne oluşturmanın başka bir yolu, anonim nesne yerine adlandırılmış bir nesne oluşturmaktır. Bu durumda, XAML ad alanı Ad adında bir nesne için bir özniteliğe sahiptir (ve XAML ad alanında olduğu için ayarlayabileceğiniz X :) vardır, böylece nesnenizi tanımlayabilir ve ona başvurabilirsiniz.

Sonuç:

Ad belirli bir nesnenin özniteliğidir, ancak X: Ad o nesnenin bir özniteliğidir (genel bir nesneyi tanımlayan bir sınıf vardır).


0

Benim araştırma x:Nameolarak küresel değişkeni. Ancak Nameolarak yerel değişken. Bu x anlamına gelir: XAML dosyanızın herhangi bir yerinde arayabileceğiniz ad, ancak Ad değil.
Misal:

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

Adının "btn" olduğu Bindingmülkün dışında olamazsınız Content.ButtonStackPanel

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.