子类化WPF UserControl不适用于项目

时间:2012-05-03 16:14:08

标签: wpf user-controls wpf-controls

您好我根据此处的信息创建了一些子类用户控件; http://csharpsimplified.wordpress.com/2011/09/21/subclassing-wpf-user-control/但是我遇到了问题。

这是我在TestUserControl项目中保存的基类。

namespace TestUserControl
{
    public class BaseDataGridControl : UserControl
    {
        protected BaseDataGridControl()
        {
        }
    }
}

这是我的具体课程;

<view:BaseDataGridControl x:Class="TestUserControl.Concrete"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:view="clr-namespace:TestUserControl"      
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Button Height="20" Width="60" Margin="12,12,228,268" />
    </Grid>
</view:BaseDataGridControl>

并且这个控件后面的代码看起来像这样;

public partial class Concrete : BaseDataGridControl
{
    public Concrete()
    {
        InitializeComponent();
    }
}

我可以在同一个TestUserControl项目的窗口中删除我的具体类,没有任何问题;

<Window x:Class="TestUserControl.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:TestUserControl">
    <Grid>
        <my:Concrete HorizontalAlignment="Left" Margin="88,39,0,0" x:Name="concrete1" VerticalAlignment="Top" />
    </Grid>
</Window>

这一切都很好。

问题是当我尝试在另一个项目中使用具体类时。

如果我创建另一个项目(WPFApplication1)并根据具体类创建一个类,例如

namespace WpfApplication1
{
    public class SubClass : Concrete
    {
    }
}

当我尝试将其放到WPFApplication1项目中的窗口时,我得到了一个;

“枚举器无效,因为集合已更改”

如果我尝试通过XAML添加它,我会得到一个

'组件'WpfApplication1.SubClass'没有URI'/TestUserControl ;component/concrete.xaml'标识的资源。

错误消息。

WPFApplication1项目引用了TestUserControl项目。

有没有人有任何线索为什么在定义用户控件的项目中有效?但是一旦你尝试在单独的项目中将其子类化它就会失败?

我在VS2010和VS11测试版中尝试了这个,结果相同。

我没有使用反射或访问类的构造函数中的任何集合,代码就是你在这里看到的。

我有测试项目可以证明这个问题,如果有帮助吗?

谢谢....

1 个答案:

答案 0 :(得分:0)

陷入类似的问题。我有一个带有基本UI的项目,一些项目是用户控件。 (我们称这个项目为“BaseUI”)。在我的第二个项目(我们将其称为“SubProj”)中,我可以为它添加引用并将其添加到Visual Studio中的xaml中,但我不能使用Blend来查看更改。现在我不能将它用于一些更复杂的编辑。

它产生错误“[组件名称在此处]不存在于命名空间[您引用的命名空间]”

我找到的修复程序可能允许您在子项目中继承它。

您可以使用链接将代码添加到当前程序集中,而不是尝试直接从引用的程序集中使用该类。该链接使控件的行为就像它在现有项目中一样,但代码来自基础项目。对它的任何更改都会影响所有链接。您应该能够从本地继承,而不会遇到跨项目的问题。

这是你如何做到的:

  1. 在“BaseUI”项目中创建基本控件
  2. 右键单击“SubProj”并添加现有项目
  3. 从“BaseUI”项目中搜索.xaml文件以获取所需的用户控件。
  4. 点击“添加”按钮旁边的箭头,然后选择“添加为链接”