黑马程序员技术交流社区

标题: WPF中控件的Name属性怎么回事 [打印本页]

作者: 大虾挂了    时间: 2013-10-25 14:08
标题: WPF中控件的Name属性怎么回事
比如我从工具箱拖一个Button,在xaml文件中,我们将它的Name设置成btn,在cs文件中,我们可以通过btn.*更改一些属性,调用一些方法什么的。其中这个btn.Name属性是不是和xaml里的Name属性不一样?毕竟我更改了它的Name,原来的那个Name还是可以代替这个按钮的,新的Name还是不能代替这个按钮。比如:btn.Name="btn1"; 。后面btn1.是会报错的。
这两个Name的区别和联系是什么呢?
作者: 我一直在等待    时间: 2013-10-25 20:14
这两个NAME是一样的. 并不是你这样写的. btn.Name="btn1"; 只有程序运行起来后  才会把名字改成btn1  但你不能用btn1去用.. 因为你只是写了一下,必没有实际上的改了他的名字
作者: 追溯客    时间: 2013-10-26 18:33
如问题得到解决,请及时修改为"以解决",黑马有你更精彩!
作者: 黑飞马    时间: 2013-10-29 15:40
这两个name 是一样的  只是 界面上的name 是程序编译时就生成了,而后一个是你程序修改的
作者: 黑飞马    时间: 2013-10-29 15:40
这两个name 是一样的  只是 界面上的name 是程序编译时就生成了,而后一个是你程序修改的
作者: 马晓平    时间: 2013-10-30 00:33
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属性的有关代码和解释希望能帮到你,这都是我整理出来的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2