1.不是所有类型都可以应用Name,然则任何类型都可以应用x:Name。
只有拥有Name属性,才可以在XAML中应用Name。不合于x:Name,因为这个是附加属性。
并且该类型、或者其父类型标识表记标帜了RuntimeNameProperty特点,才拥有与x:Name一样的结果。
例如:<SolidColorBrush Color="Transparent" Name="ddd"/>便会报错,因为SolidColorBrush没有Name属性。
只能应用x:Name。<SolidColorBrush Color="Transparent" x:Name="ddd"/>
2.在WPF中,很多控件拥有Name属性,例如上方我们应用Button的Name来设置Content,button.Content=button.Name。
是因为它们的父类FrameworkElement中都定义了Name属性,以下用SomeWpfType来庖代这些类型(便于表述)。
下面,我们不应用XAML和x:Name,应用Code-Behind和SomeWpfType.Name来测试一下。
namespace Cnblog
{
// 应用Button的Name属性
public class SetNameByCodeBehind : Window
{
public SetNameByCodeBehind()
{
// Buttons
var button1 = new Button { Name = "Button1" };
button1.Loaded += ButtonLoaded;
var button2 = new Button { Name = "Button2" };
button2.Loaded += ButtonLoaded;
// StackPanel
var contentPanel = new StackPanel();
contentPanel.Children.Add(button1);
contentPanel.Children.Add(button2);
// Window
this.Title = "Set Name By Code-Behind";
this.Height = 100;
this.Width = 300;
this.Content = contentPanel;
}
void ButtonLoaded(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
button.Content = button.Name;
}
}
}
应用Button的Name属性
下面,差别终于有了,我们再来看IL的内容:
因为不是应用XAML书写的,所以缺乏一些函数和对象,然则更首要的是:缺乏两个Button对象的定义。
若是我们批改一下代码,再来看一下,就能清楚的知道原因了
namespace Cnblog
{
public class SetNameByCodeBehind : Window
{
// 批改为internal的对象,庖代之前的局部变量
internal Button Button1;
internal Button Button2;
public SetNameByCodeBehind()
{
// Buttons
Button1 = new Button { Name = "Button1" };
Button1.Loaded += ButtonLoaded;
Button2 = new Button { Name = "Button2" };
Button2.Loaded += ButtonLoaded;
// StackPanel
var contentPanel = new StackPanel();
contentPanel.Children.Add(Button1);
contentPanel.Children.Add(Button2);
// Window
this.Title = "Set Name By Code-Behind";
this.Height = 100;
this.Width = 300;
this.Content = contentPanel;
}
void ButtonLoaded(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
button.Content = button.Name;
}
}
}
应用Button的Name属性2
再来看一下IL的内容:
结论:
x:Name不是SomeWpfType.Name,设置了x:Name后(假设为ElementName),
其实做了两件工作:
1. 创建一个internal的对象,对象名字为ElementName,它其实是一个对此SomeWpfType类型对象的引用;
internal ElementName = new SomeWpfType();// 假设SomeWpfType为我们定义的类型。
2. 设置此对象的Name属性,
ElementName.Name = "ElementName";
这是有关Name属性的有关代码和解释希望能帮到你,这都是我整理出来的 |