none
我刚才好像挖坟了..求版主宽恕..我再开一新帖: 能否在项目中继承一个dll内的UserControl? RRS feed

  • 问题

  • 各位大大好,小弟是刚毕业的新人.开发中遇到了此问题,求大大们解答.

    情况是这样,解决方案中的两个dll工程(都是wpf),A和B. 我在A中做了一个自定义控件(UserControl),使用正常.若在A中写一个类(.cs),继承此UserControl,也没有任何问题.

    但是我在工程B中,引用了A之后.写一个类继承此UserControl.编译可通过.但是运行时,走到调用基类(A中的那个UserControl)的构造函数的地方,出现异常:[子类]不具有由[基类]识别的资源

    请问各位这个问题是什么原因导致的? 有没有解决方法?

    小弟不胜感激


    2011年8月25日 6:36

答案

  • OK, 我知道,原因是你的UserControl的XAML编译成BAML后是在A的资源里面的,在你的B项目中构造子类控件的时候,由于B项目无法读取A的资源,所以抛出此异常。

    这个问题就说明了一点,WPF中是不推荐继承自自己的UserControl的,而是推荐继承自CustomControl. 我想你应该有所了解这两者的区别,一个由XAML决定整体可见内容,一个由自定义控件模板决定样式。如果是跨程序集的话,就更不可以继承另外程序集的UserControl类了。

    所以,你的问题有一个方法: 把你的UserControl基类设计成 CustomControl 基类。

    看我的例子: https://skydrive.live.com/?cid=51b2fdd068799d15#!/?cid=51b2fdd068799d15&sc=documents&uc=1&id=51B2FDD068799D15%21813

     

    Sincerely,

     

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月30日 8:03
    版主

全部回复

  • 问题是这样子的:

    我把一个包含一批控件的窗体写成了一个UserControl,写成的控件运行良好,但是我写的这个UserControl不能在另一个程序集里被继承(在和这个UserControl同一个程序集里继承没有问题)。

    问题的原因好像是需要用到原UserControl的XAML资源?

    请问这个问题可以用什么简单一点的方式解决?

    2010年7月26日 8:00
  • 新建一WPF用户控件库,全部使用默认设定。编译,生成一.dll文件

    新建一WPF应用程序,从刚才的控件库的控件派生一新控件:

      public class MyControl : WpfControlLibrary1.UserControl1
      {
        public MyControl():base(){}
      }

    编译能通过,但程序运行的时候,这个MyControl初始化就会出错。

    但,如果把上面这段代码放在.dll所在的工程里,使用一切正常:(

    2010年7月26日 8:15
  • 您好..我现在在开发中遇到了和您相同的问题,即自己写的UserControl在同一个工程内可以继承并使用正常,在另一个引用此工程(或DLL)的工程中继承,运行就报错: [子类]不具有由[父类]识别的资源

    请问您的这个问题是否解决了,若解决了能否告诉我原因和解决方法? 感激不尽

    2011年8月25日 6:25
  • 补充一点..搜到的其他说法中有提到,这有可能是B引用A这个引用的问题.但是我按照他给的解决方法去试,无效.

    不过的确..同一个项目里就没问题,引用就有问题

    2011年8月25日 7:54
  • 首先,不是你所说的引用问题。

    而是你的A中的UserControl使用了WPF的资源,而这个资源是A项目的,他并没有公开给B项目,所以运行时B要调用A项目基类的这个资源就会发生异常,说找不到。

    当然我这里只能给你这么说原因,但是要具体的解决方案,需要你给我你的项目或者具体A中那个基类的代码(包括XAML代码)

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月29日 3:12
    版主
  • 帖子是不需要重复发的,我们会在一周时间内来处理的。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月29日 3:13
    版主
  • 这个我做过试验..我新建了一个UserControl,然后不添加任何代码(包括xaml代码),依然无法继承,也就是说默认一开始就有东西是不公开的? 您可以试一下 谢谢

    2011年8月30日 4:53
  • OK, 我知道,原因是你的UserControl的XAML编译成BAML后是在A的资源里面的,在你的B项目中构造子类控件的时候,由于B项目无法读取A的资源,所以抛出此异常。

    这个问题就说明了一点,WPF中是不推荐继承自自己的UserControl的,而是推荐继承自CustomControl. 我想你应该有所了解这两者的区别,一个由XAML决定整体可见内容,一个由自定义控件模板决定样式。如果是跨程序集的话,就更不可以继承另外程序集的UserControl类了。

    所以,你的问题有一个方法: 把你的UserControl基类设计成 CustomControl 基类。

    看我的例子: https://skydrive.live.com/?cid=51b2fdd068799d15#!/?cid=51b2fdd068799d15&sc=documents&uc=1&id=51B2FDD068799D15%21813

     

    Sincerely,

     

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月30日 8:03
    版主
  • 学习了!多谢大大!
    2011年8月30日 8:29