Есть ли разница в x: name и name для элементов управления в файле xaml? - PullRequest
6 голосов
/ 31 июля 2010

Я новичок в Silverlight.
Когда я добавляю некоторый элемент управления в свой файл xaml с помощью Visual Studio, он устанавливает имя элемента управления с помощью свойства Name, но также присутствует x: Name.
Есть ли разница и когда использовать каждый из них?
Спасибо.

Ответы [ 3 ]

12 голосов
/ 01 августа 2010

Вкратце

Да, есть разница.Суть в том, что x:Name можно использовать для элементов объекта, которые не имеют собственных свойств Name.

Более длинное объяснение

Вы можете толькоиспользуйте Name для элемента, который представляет объект, который действительно имеет свойство Name.Например, все, что происходит от FrameworkElement.

Атрибут x:Name может быть помещен в любой элемент, представляющий объект независимо от того, имеет ли этот объект свойство Name.Если объект имеет свойство Name, то ему будет присвоено значение x:Name, следовательно, вы не можете иметь и x:Name, и Name для одного элемента.

Когда объектимеет свойство Name или свойство x:Name, значение этого свойства связано с записью объектов в дереве объектов.Именно через дерево объектов метод FindName FrameworkElement может найти объект.FindName может находить объекты по имени, даже если этот объект не имеет собственного свойства Name, поскольку использует имя, записанное в дереве объектов.

Автоматически сгенерированный код для UserControl будет содержатьопределения полей для любого элемента, который имеет свойство Name или x:Name.Сгенерированный метод InitialiseComponent будет использовать метод FindName для присвоения значений этим полям.

Пример

Приведенный выше Xaml создает два поля LayoutRoot типа Grid и MyBrush типа SolidColorBrush.Если бы вы изменили x:Name="LayoutRoot" на Name="LayoutRoot", это ничего бы не изменило.Grid имеет свойство Name.Однако попробуйте изменить x:Name="MyBrush" на Name="MyBrush".Это не работает, потому что SolidColorBrush не имеет свойства name.С помощью вышеуказанного Xaml вы можете сделать код следующим образом: -

    public MainPage()
    {
        InitializeComponent();
        MyBrush.Color = Colors.LightGray;
    }

Откройте определение InitializeComponent и взгляните на автоматически сгенерированный код.

2 голосов
/ 31 июля 2010

Нет, вы просто не можете использовать их обоих. x: Name - это то, что на самом деле использует препроцессор XAML, а Name - это просто свойство удобства, предоставленное классу FrameworkElement для его установки.

Из справочника MSDN :

Если Name доступно как свойство элемента, Name и x: Name могут использоваться взаимозаменяемо, но возникает ошибка, если оба атрибута указаны для одного и того же элемента.

1 голос
/ 01 сентября 2010

Короткий ответ: если вы пишете что-то в XAML, вероятно, лучше всего последовательно использовать x: Name.

Длинный ответ: в предыдущем ответе упоминалось, что Name является свойством «удобства» для доступах: Имя.Правильно.Однако теперь, когда среда инструментов для XAML как в Visual Studio, так и в серии Expression действительно созрела, и вы видите все больше и больше генерируемого инструментами XAML, вы, вероятно, также видите все больше и больше x: Name в отличие от Name.Инструменты предпочитают x: Name, потому что таким образом они не принимают несколько рискованную зависимость (потенциально специфичную для фреймворка) в отношении: как x: Name и Name действительно одинаковы, и им не нужно переключаться между настройкой Name, если что-тооказывается FrameworkElement, а затем x: Name на чем-то похожем на раскадровку и генерирует двойственность, если вы посмотрите на этот XAML через что-то вроде DOM.Другими словами, атрибут «Имя» в XAML на самом деле гораздо менее «удобен» для использования в настоящее время, чем это можно было представить в первоначальной разработке API.Часть «удобства» заключалась в том, что не нужно отображать x :, но вы все равно должны это делать для x: Class, и к настоящему времени почти все привыкли к эффективному использованию атрибутов x: и общих принципов разметки XAML.

Я не уверен в утверждении оригинального автора, что VS рекомендует использовать Name.Да, имя отображается как опция intellisense, но и x: Name.И все случаи, которые я вижу в шаблонах, где объекту присваивается начальное имя, используют x: Name, хотя большинство из них - FrameworkElements.

...