2

嗨,我根据此处找到的信息创建了一些子类用户控件;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 beta 中尝试过这个,结果同样糟糕。

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

我有一个演示这个问题的测试项目,如果它有帮助吗?

谢谢 ....

4

1 回答 1

0

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

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

我发现的修复可能会允许您在子项目中继承它。

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

这是你如何做到的:

  1. 在“BaseUI”项目中创建基本控件
  2. 右键单击您的“子项目”并添加现有项目
  3. 从“BaseUI”项目中寻找所需的用户控件的 .xaml 文件。
  4. 单击“添加”按钮旁边的箭头,然后选择“添加为链接”
于 2015-02-10T06:07:13.787 回答