Judulnya mengatakan itu semua. Kadang-kadang tampaknya atribut Name
dan x:Name
dipertukarkan.
Jadi, apa perbedaan definitif di antara mereka, dan kapan lebih baik menggunakan yang satu dari yang lain?
Adakah implikasi kinerja atau memori untuk menggunakannya dengan cara yang salah?
.net
wpf
xaml
name-attribute
Drew Noakes
sumber
sumber
x:Name
semua waktu berfungsi dengan baik. Saya baru saja harus mengubahnya menjadiName
kalau tidak saya tidak bisa referensi kontrol dalam kode .xaml.cs saya jadi saya akan berasumsi bahwa itu tidak lagi berfungsi dengan baik sepanjang waktu.Jawaban:
Hanya ada satu nama di XAML, the
x:Name
. Kerangka kerja, seperti WPF, secara opsional dapat memetakan salah satu propertinya ke XAMLx:Name
dengan menggunakanRuntimeNamePropertyAttribute
on the class yang menunjuk salah satu properti class sebagai pemetaan ke x: Atribut atribut XAML.Alasan ini dilakukan adalah untuk memungkinkan kerangka kerja yang sudah memiliki konsep "Nama" saat runtime, seperti WPF. Di WPF, misalnya,
FrameworkElement
memperkenalkan properti Name.Secara umum, kelas tidak perlu menyimpan nama untuk
x:Name
dapat digunakan. Semuax:Name
sarana untuk XAML adalah menghasilkan bidang untuk menyimpan nilai dalam kode di belakang kelas. Apa yang dilakukan runtime dengan pemetaan itu bergantung pada kerangka kerja.Jadi, mengapa ada dua cara untuk melakukan hal yang sama? Jawaban sederhananya adalah karena ada dua konsep yang dipetakan pada satu properti. WPF menginginkan nama elemen yang disimpan pada saat runtime (yang dapat digunakan melalui Bind, antara lain) dan XAML perlu tahu elemen apa yang ingin diakses oleh bidang dalam kode di belakang kelas. WPF mengikat keduanya bersama-sama dengan menandai properti Name sebagai alias dari x: Name.
Di masa depan, XAML akan memiliki lebih banyak kegunaan untuk x: Nama, seperti memungkinkan Anda untuk mengatur properti dengan merujuk ke objek lain dengan nama, tetapi di 3.5 dan sebelumnya, itu hanya digunakan untuk membuat bidang.
Apakah Anda harus menggunakan satu atau yang lain benar-benar pertanyaan gaya, bukan yang teknis. Saya akan menyerahkan itu kepada orang lain untuk rekomendasi.
Lihat juga AutomationProperties.Name VS x: Name , AutomationProperties.Name digunakan oleh alat aksesibilitas dan beberapa alat pengujian.
sumber
x:Name
karenaName
tidak akan membuat bidang untuk dikenali di belakang kode. Saya masih tidak tahu mengapa ini terjadi.Name
properti itu artinya sama. Jika elemen tidak memilikiName
properti, Anda harus menggunakanx:Name
.Mereka bukan hal yang sama.
x:Name
adalah konsep xaml, digunakan terutama untuk elemen referensi. Ketika Anda memberikan elemen atribut x: Name xaml, "ditentukanx:Name
menjadi nama bidang yang dibuat dalam kode yang mendasari ketika xaml diproses, dan bidang itu menyimpan referensi ke objek." ( MSDN ) Jadi, ini adalah bidang yang dibuat oleh desainer, yang memiliki akses internal secara default.Name
adalah properti string yang ada dariFrameworkElement
, terdaftar sebagai properti elemen WPF lainnya dalam bentuk atribut xaml.Sebagai konsekuensinya, ini juga berarti
x:Name
dapat digunakan pada objek yang lebih luas. Ini adalah teknik untuk memungkinkan apa pun dalam xaml untuk dirujuk oleh nama yang diberikan.sumber
x: Nama dan Nama merujuk ruang nama yang berbeda.
x: name adalah referensi ke namespace x yang didefinisikan secara default di bagian atas file Xaml.
Hanya mengatakan Nama menggunakan namespace default di bawah ini.
x: Nama mengatakan gunakan namespace yang memiliki x alias. x adalah default dan kebanyakan orang membiarkannya tetapi Anda dapat mengubahnya ke apa pun yang Anda suka
jadi referensi Anda adalah foo: name
Tentukan dan Gunakan Ruang Nama di WPF
OK mari kita lihat ini dengan cara yang berbeda. Katakanlah Anda menarik dan melepas tombol ke halaman Xaml Anda. Anda dapat merujuk 2 cara ini x: nama dan nama . Semua xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" dan xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" adalah referensi ke beberapa ruang nama . Karena xaml memegang Control namespace (tidak 100% dari itu) dan presentasi memegang FrameworkElement AND kelas Button memiliki pola pewarisan:
Jadi seperti yang diharapkan seseorang yang mewarisi dari FrameworkElement akan memiliki akses ke semua atribut publik. jadi dalam kasus Button, ia mendapatkan atribut Name dari FrameworkElement, di bagian paling atas hierarki pohon. Jadi Anda bisa mengatakan x: Nama atau Nama dan mereka berdua akan mengakses pengambil / penyetel dari FrameworkElement.
Referensi MSDN
WPF mendefinisikan atribut CLR yang dikonsumsi oleh prosesor XAML untuk memetakan beberapa ruang nama CLR ke ruang nama XML tunggal. The XmlnsDefinitionAttribute atribut ditempatkan di tingkat perakitan dalam kode sumber yang menghasilkan perakitan. Kode sumber perakitan WPF menggunakan atribut ini untuk memetakan berbagai ruang nama umum, seperti System.Windows dan System.Windows.Controls, ke http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace.
Jadi atribut assembly akan terlihat seperti:
PresentationFramework.dll - XmlnsDefinitionAttribute:
sumber
http://schemas.microsoft.com/winfx/2006/xaml
berlakuControl
karena Anda dapat menggunakannya secara langsung di XAML tanpa namespace 'x':<Control />
Keduanya sama, banyak elemen framework mengekspos properti nama sendiri, tetapi bagi mereka yang tidak dapat menggunakan x: name - Saya biasanya hanya menggunakan x: name karena itu berfungsi untuk semuanya.
Kontrol dapat mengekspos nama diri mereka sebagai Properti Ketergantungan jika mereka mau (karena mereka perlu menggunakan Properti Ketergantungan secara internal), atau mereka dapat memilih untuk tidak.
Lebih detail di msdn sini dan di sini :
sumber
X: Nama dapat menyebabkan masalah memori jika Anda memiliki kontrol khusus. Ini akan menyimpan lokasi memori untuk entri NameScope.
Saya katakan tidak pernah menggunakan x: Nama kecuali Anda harus.
sumber
FrameworkElement.RegisterName("elementname")
. Namun, jika Anda memanggilnyaFrameworkElement.UnregisterName("elementname")
bisa "dereferenced".Satu-satunya perbedaan adalah bahwa jika Anda menggunakan Kontrol pengguna ke dalam kontrol dari Same Assembly maka Name tidak akan mengidentifikasi kontrol Anda dan Anda akan mendapatkan kesalahan "Gunakan x: Nama untuk kontrol di Assembly yang sama". Jadi x: Nama adalah versi WPF dari kontrol penamaan di WPF. Nama hanya digunakan sebagai Warisan Winform. Mereka ingin membedakan penamaan kontrol di WPF dan winforms karena mereka menggunakan atribut di Xaml untuk mengidentifikasi kontrol dari majelis lain yang mereka gunakan x: untuk Nama kontrol.
Hanya perlu diingat jangan meletakkan nama untuk kontrol hanya demi menjaganya karena berada di memori sebagai kosong dan itu akan memberi Anda peringatan bahwa Nama telah diterapkan untuk kontrol tetapi tidak pernah digunakan.
sumber
Nama :
x: Nama :
Menggunakan kedua arahan dalam XAML untuk satu FrameworkElement atau FrameworkContentElement akan menyebabkan pengecualian: jika XAML dikompilasi markup, pengecualian akan terjadi pada kompilasi markup, jika tidak itu terjadi pada beban.
sumber
x:Name
berarti: membuat bidang dalam kode di belakang untuk menyimpan referensi ke objek ini.Name
berarti: mengatur properti nama objek ini.sumber
Saya selalu menggunakan varian x: Name. Saya tidak tahu apakah ini mempengaruhi kinerja apa pun, saya merasa lebih mudah karena alasan berikut. Jika Anda memiliki kontrol pengguna Anda sendiri yang berada di majelis lain hanya properti "Nama" tidak akan selalu cukup. Ini membuatnya lebih mudah untuk hanya menempelkan properti x: Name.
sumber
Ini bukan item WPF tetapi XML standar dan BtBh telah menjawabnya dengan benar, x merujuk ke namespace default. Dalam XML ketika Anda tidak awalan elemen / atribut dengan namespace itu mengasumsikan Anda menginginkan namespace default. Jadi mengetik saja
Name
tidak lebih dari sekadar pekerjaan singkatx:Name
. Rincian lebih lanjut tentang ruang nama XML dapat ditemukan di teks tautansumber
Salah satu jawabannya adalah bahwa nama x: akan digunakan dalam berbagai bahasa program seperti c # dan nama yang akan digunakan untuk kerangka kerja. Jujur itu seperti apa bagiku.
sumber
X yang ditentukan : Nama menjadi nama bidang yang dibuat dalam kode yang mendasari ketika XAML diproses, dan bidang itu menyimpan referensi ke objek. Di Silverlight, menggunakan API yang dikelola, proses pembuatan bidang ini dilakukan oleh langkah-langkah target MSBuild, yang juga bertanggung jawab untuk bergabung dengan kelas parsial untuk file XAML dan kode-belakangnya. Perilaku ini tidak harus ditentukan dalam bahasa XAML; itu adalah implementasi khusus yang Silverlight terapkan untuk menggunakan x: Nama dalam model pemrograman dan aplikasinya.
Baca Lebih Lanjut tentang MSDN ...
sumber
Ketika Anda mendeklarasikan elemen Button di XAML Anda merujuk ke kelas yang didefinisikan dalam windows run time yang disebut Button.
Tombol memiliki banyak atribut seperti latar belakang, teks, margin, ..... dan atribut yang disebut Nama.
Sekarang ketika Anda mendeklarasikan Tombol di XAML adalah seperti membuat objek anonim yang kebetulan memiliki atribut bernama Nama.
Secara umum Anda tidak bisa merujuk ke objek anonim, tetapi dalam kerangka kerja WPF XAML prosesor memungkinkan Anda untuk merujuk ke objek tersebut dengan nilai apa pun yang Anda berikan ke atribut Name.
Sejauh ini bagus.
Cara lain untuk membuat objek adalah membuat objek bernama bukan objek anonim. Dalam hal ini namespace XAML memiliki atribut untuk objek bernama Name (dan karena itu ada dalam ruang nama XAML maka punya X :) yang dapat Anda atur sehingga Anda dapat mengidentifikasi objek Anda dan merujuknya.
Kesimpulan:
Nama adalah atribut dari objek tertentu, tetapi X: Nama adalah salah satu atribut dari objek itu (ada kelas yang mendefinisikan objek umum).
sumber
Penelitian saya adalah
x:Name
sebagai variabel global . Namun,Name
sebagai variabel lokal . Apakah itu berarti x: Nama yang dapat Anda panggil di mana saja di file XAML Anda tetapi Name tidak.Contoh:
Anda tidak bisa
Binding
propertiContent
dariButton
dengan Nama adalah "btn" karena di luarStackPanel
sumber