none
silverlight中用户自定义控件之间支持继承吗?怎么实现? RRS feed

  • 问题

  • 类似于OO编程中的继承。比如我有一个抽象类“动物”以及其中抽象方法“move()”,他有两个实现类“鹰”和“鸡”,他们对于“移动()”分别有自己的实现fly和run。

     

    不知道在silverlight中如何实现?恳请不吝赐教!

     

    可能我的表述有些问题,我是想问的是silverlight中的用户自定义的控件如何实现继承。比如我创建了“动物”这个User Control,然后想让“鹰”和“鸡”这两个UserControl继承它。(当然这里不是单只cs类之间的继承,也包括XAML的)。

     

    2008年9月8日 6:28

答案

  • 和我说的这个问题有点像:
    http://forums.microsoft.com/china/ShowPost.aspx?PostID=3811960&SiteID=15

    目前还没解决。关注ing.

    另外,我有一个简单的思路,那就是,自定义的控件,完全写在cs中。当然包括xaml模板,模板内容做为一个字符串定义,并做为自定义控件的模板应用。

    如果是用设计器来做,好像不太行(?)
    2008年9月8日 20:08

全部回复

  • 用户控件本身就是一个OO中的类。可以实现继承的。

    2008年9月8日 7:00
    版主
  •  Shiny Zhu 写:

    用户控件本身就是一个OO中的类。可以实现继承的。

     

    可我创建“Silverlight User Control”项目时都是继承自UserControl类。如何让它继承我自定义的Sivlerlight Control?

    2008年9月8日 7:55
  • 和我说的这个问题有点像:
    http://forums.microsoft.com/china/ShowPost.aspx?PostID=3811960&SiteID=15

    目前还没解决。关注ing.

    另外,我有一个简单的思路,那就是,自定义的控件,完全写在cs中。当然包括xaml模板,模板内容做为一个字符串定义,并做为自定义控件的模板应用。

    如果是用设计器来做,好像不太行(?)
    2008年9月8日 20:08
  • 关于你的问题:

    1、如果你希望能够吧XAML作为字符串写入到控件定义的实现中去,可以参考我的博客:

    http://hi.baidu.com/zhenyk/blog/item/dfc54059532e692f2834f09c.html

    可以直接从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方法,就可以完成对动态创建的控件的引用。

     

     

    2、关于创建控件和继承的问题:

    http://hi.baidu.com/zhenyk/blog/item/75f1f21b442c77d0ac6e75a8.html

    建议你使用CustomerControl,按照我博客里的文章来实现,具体的继承,就像编写普通的C#定义一样。

    这里实现控件行为的方式还是通过自定义事件+事件处理程序来实现,对于你的方案来说比较理想。

    如果熟悉Template和Style的用法,你就可以轻松实现换肤,这些Template和Style的定义也可以像字符串一样写在定义中,或者你可以封装在单独的DLL里面。

    2008年9月9日 2:46
  •  HiYouAll 写:
    和我说的这个问题有点像:
    http://forums.microsoft.com/china/ShowPost.aspx?PostID=3811960&SiteID=15

    目前还没解决。关注ing.

    另外,我有一个简单的思路,那就是,自定义的控件,完全写在cs中。当然包括xaml模板,模板内容做为一个字符串定义,并做为自定义控件的模板应用。

    如果是用设计器来做,好像不太行(?)

     

     

    看来目前没有一个完美而优雅的解决办法了。sigh!

    我目前才有就是您的第一种解决方法,这样可以用设计器,唯一的缺点是要不断更改 xxx.g.cs文件中的基类。

    权衡一下利大于弊!谢谢各位大虾的指教,不胜感激。

     

    希望在在silverligh 的2.0正式版中这些烦人的问题能够得到解决。

    2008年9月10日 1:55
  • 我现在设计的方案,根据不同的情况加载不同的DLL,通过反射的方式来装载控件,整个过程由一个UI引擎来负责处理,这个UI引擎就是你提到的"动物",所有的控件就是一个个DLL也就是"鸡"和"鹰",需要用鸡或者鹰就加载不同的DLL,加载采用WebClient来下载,然后用Assemble来读取,用InvokeMember来执行“flay” 或 “run” ,这样不就能实现你的需求了?

    总之,UserControl本来就不是设计用来相互继承的,UserControl在文档中的解释是控件的集合,如果有继承的必要,直接在新控件里放下老的UserControl,这样就使新UserControl里有了一个老的UserControl了,同时具备了老UserControl的所有行为,这就应该是所谓继承吧? 而CustomerControl是用来创造系统没有提供的控件,就是无中生有:)

    2008年9月15日 19:29