Есть ли какое-либо различие в x:name и названии средств управления в xaml файле?

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

6
задан Ian Ringrose 12 February 2014 в 11:43
поделиться

2 ответа

Вкратце

Да, есть разница. Суть в том, что 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 и взгляните на автоматически сгенерированный код.

12
ответ дан 8 December 2019 в 15:58
поделиться

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

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

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

2
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: