none
Name属性如何在编码中设置? RRS feed

  • 问题

  •  

    很奇怪,为什么只能在设计时的XAML中设置呢?

     

    如果我动态添加的控件,要怎么(通过FindName方法)找到它呢?或有其它独特方式?

     

    怪怪,谁解释一下。

    2008年8月29日 18:49

答案

  • 可以直接从XAML代码片段中动态创建控件,通过使用XamlReader类的Load方法,该方法需要一个字符串类型的XAML代码片断。XamlReader.Load方法将在内存中创建控件,如果创建成功,将返回一个Object类型的引用,通过类型转换变为所需的类型。如果创建失败否则返回null。下面的示例代码使用XAML代码创建一个矩形,如下所示:

    using System;

    using System.Windows;

    using System.Windows.Controls;

    using System.Windows.Documents;

    using System.Windows.Ink;

    using System.Windows.Input;

    using System.Windows.Media;

    using System.Windows.Media.Animation;

    using System.Windows.Shapes;

    namespace CreateUIFromXAMLSnippt

    {

        public partial class Page : Canvas

        {

            Rectangle rc1;

            public void Page_Loaded(object o, EventArgs e)

            {

                // Required to initialize variables

                InitializeComponent();

                CreateRectangleFromXAML(100, 100, 200, 200);

                //如果需要引用动态创建的控件,需要使用FindName.

                rc1 = this.FindName("rc1") as Rectangle;

                rc1.MouseLeftButtonDown += new MouseEventHandler(rc1_MouseLeftButtonDown);

            }

            //定义矩形的单击行为

            void rc1_MouseLeftButtonDown(object sender, MouseEventArgs e)

            {

                rc1.Fill = new SolidColorBrush(Colors.Blue);

            }

            //XAML代码中动态创建矩形

            private void CreateRectangleFromXAML(double X,double Y,double W,double H)

            {

                //XAML代码

                string s = "<Rectangle Name='rc1' Canvas.Left='" + X + "' Canvas.Top='" + Y + "' "+ "Width='" + W + "' Height='" + H + "' Fill='Red' />";

                //使用XamlReader类创建矩形

                Rectangle rc = (Rectangle)XamlReader.Load(s);

                //添加到根画布中

                this.Children.Add(rc);

            }

        }

    }

    如果需要引用动态创建的控件,需要注意不能在XAML代码中使用x:Name属性,通过为其指定Name属性,并使用FindName方法,就可以完成对动态创建的控件的引用。

    2008年9月9日 3:17

全部回复

  •  

    哇噻,有一颗星了捏,当上小队长了。
    2008年8月29日 18:52
  • 试试

    Element.SetValue(Canvas.NameProperty, "Name");

    你动态成生的元素只要记住你生成的实例名就行了,比设置Name要方便多哇

    2008年8月29日 19:55
    版主
  • 可以直接从XAML代码片段中动态创建控件,通过使用XamlReader类的Load方法,该方法需要一个字符串类型的XAML代码片断。XamlReader.Load方法将在内存中创建控件,如果创建成功,将返回一个Object类型的引用,通过类型转换变为所需的类型。如果创建失败否则返回null。下面的示例代码使用XAML代码创建一个矩形,如下所示:

    using System;

    using System.Windows;

    using System.Windows.Controls;

    using System.Windows.Documents;

    using System.Windows.Ink;

    using System.Windows.Input;

    using System.Windows.Media;

    using System.Windows.Media.Animation;

    using System.Windows.Shapes;

    namespace CreateUIFromXAMLSnippt

    {

        public partial class Page : Canvas

        {

            Rectangle rc1;

            public void Page_Loaded(object o, EventArgs e)

            {

                // Required to initialize variables

                InitializeComponent();

                CreateRectangleFromXAML(100, 100, 200, 200);

                //如果需要引用动态创建的控件,需要使用FindName.

                rc1 = this.FindName("rc1") as Rectangle;

                rc1.MouseLeftButtonDown += new MouseEventHandler(rc1_MouseLeftButtonDown);

            }

            //定义矩形的单击行为

            void rc1_MouseLeftButtonDown(object sender, MouseEventArgs e)

            {

                rc1.Fill = new SolidColorBrush(Colors.Blue);

            }

            //XAML代码中动态创建矩形

            private void CreateRectangleFromXAML(double X,double Y,double W,double H)

            {

                //XAML代码

                string s = "<Rectangle Name='rc1' Canvas.Left='" + X + "' Canvas.Top='" + Y + "' "+ "Width='" + W + "' Height='" + H + "' Fill='Red' />";

                //使用XamlReader类创建矩形

                Rectangle rc = (Rectangle)XamlReader.Load(s);

                //添加到根画布中

                this.Children.Add(rc);

            }

        }

    }

    如果需要引用动态创建的控件,需要注意不能在XAML代码中使用x:Name属性,通过为其指定Name属性,并使用FindName方法,就可以完成对动态创建的控件的引用。

    2008年9月9日 3:17