Я являюсь новым в Silverlight.
Когда я добавляю некоторое управление к своему xaml файлу с Visual Studio, это определило имя средств управления со свойством Name, но существует также x:Name.
Есть ли какое-либо различие и когда использовать каждого из них?
Спасибо.
Вкратце
Да, есть разница. Суть в том, что x: Name
можно использовать для элементов объекта, не имеющих собственных свойств Name
.
Более подробное объяснение
Вы можете использовать Имя
только в элементе, который представляет объект, который действительно имеет свойство Имя
. Например, все, что происходит от FrameworkElement
.
Атрибут x: Name
может быть помещен в любой элемент, представляющий объект , независимо от того, действительно ли этот объект имеет свойство Name
. Если у объекта действительно есть свойство Name
, то ему будет присвоено значение x: Name
, следовательно, у вас не может быть одновременно x: Name
и Имя
в том же элементе.
Когда объект имеет свойство Имя
или свойство x: Name
, значение этого свойства связывается с записью объекта в дереве объектов. Именно через дерево объектов метод FindName
элемента FrameworkElement
может найти объект. FindName
может находить объекты по имени, даже если этот объект не имеет собственного свойства Name
, поскольку он использует имя, записанное в дереве объектов.
Автоматически созданный код для UserControl
будет содержать определения полей для любого элемента, имеющего свойство Name
или x: Name
. Созданный метод InitialiseComponent
будет использовать метод FindName
для присвоения значений этим полям.
Пример
Приведенный выше Xaml создает два поля LayoutRoot
типа Grid
и MyBrush
типа SolidColorBrush
. Если вы измените x: Name = "LayoutRoot"
на Name = "LayoutRoot"
, это ничего не изменит. Сетка
имеет свойство Имя
. Однако попробуйте изменить x: Name = "MyBrush"
на Name = "MyBrush"
. Это не работает, потому что SolidColorBrush
не имеет свойства name. Затем с помощью приведенного выше Xaml вы можете выполнить такой код: -
public MainPage()
{
InitializeComponent();
MyBrush.Color = Colors.LightGray;
}
Откройте определение InitializeComponent
и взгляните на автоматически сгенерированный код.
Нет, вы просто не можете использовать их оба. x:Name - это то, что на самом деле использует препроцессор XAML, а Name - это просто удобное свойство, предоставляемое классу FrameworkElement для его установки.
Из справочника MSDN:
Если Name доступно как свойство элемента, Name и x:Name могут использоваться взаимозаменяемо, но если оба атрибута указаны для одного элемента, возникает ошибка.