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