1

我创建了一系列UserControls,它们都有一些类似的业务逻辑。所以我试图在一个抽象基类中实现这个通用业务逻辑,所有这些用户控件都将继承它。继承链看起来是这样的:当不继承时,Visual Studio覆盖UserControl父System.Windows.Controls.UserControl

System.Windows.Controls.UserControl < - MyControlBase(摘要)< --MyControl1,MyControl2等

我创建了MyControl1,MyControl2等类作为Visual Studio中的用户控件。我已经设置类从MyControlBase而不是System.Windows.Controls.UserControl继承。它工作得很好......直到我在XAML中进行更改并重新保存。 Visual Studio 2008然后重新分配生成的类以从System.Windows.Controls.UserControl继承。

类和XAML的代码示例如下:

// MyControlBase.cs: 

    public abstract class MyControlBase.Windows.Controls.UserControl 
    { 
     public abstract void DoOperation1(); 
    } 

// MyControlBase.xaml: none 

// MyControl1.cs: 

    public partial class MyControl1: MyControlBase 
    { 
     public MyControl1() 
     { 
      InitializeComponent(); 
     } 
     public override void DoOperation1() 
     { 
      return; 
     } 
    } 

// MyControl1.xaml: 

    <UserControl x:Class="Test.Controls.BarChart" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
     <Grid x:Name="LayoutRoot" Background="Blue"> 

     </Grid> 
    </UserControl> 

// mycontrol1.g.cs (generated by Visual Studio) orginally 

    public partial class MyControl1: System.Windows.Controls.UserControl 
    { 

     internal System.Windows.Controls.Grid LayoutRoot; 

     // InitilizeComponent() etc 

    } 

// mycontrol1.g.cs (generated by Visual Studio) modified by me 

public partial class MyControl1: MyControlBase 
    { 

     internal System.Windows.Controls.Grid LayoutRoot; 

     // InitilizeComponent() etc 
    } 

每当它保存修改后mycontrol1.g.cs在Visual Studio 2008编辑器中编辑MyControl1.xaml保持自身恢复到原来的一个(命名:从System.Windows.Controls.UserControl再次继承)。然后编译失败,因为MyControl1的两个部分类不是从同一个父类继承的:VS生成的继承自System.Windows.Controls.UserControl,我的代码来自MyControlBase。

有没有办法解决这个问题?我希望能够从一个抽象类继承,并假定Visual Studio有一种方法让我,我只是不明白我错过了什么。或者是UserControl从另一个类继承的概念,而不是System.Windows.Controls.UserControl是一个坏概念?

+1

您的类的实际代码示例定义行和初始XAML将有所帮助。 – AnthonyWJones 2009-10-30 13:13:38

+0

我已经添加了一些代码检查,也许这有助于。 – 2009-10-30 14:10:39

回答

1

你需要改变你的XAML从MyControlBase而不是用户控件继承:

<my:MyControlBase 
    xmlns:my="MyNamespace" 
    x:Class="Visiblox.Charts.Test.Controls.BarChart" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid x:Name="LayoutRoot" Background="Blue"> 
    </Grid> 
</my:MyControlBase> 

这就是为什么Visual Studio中不断变化的基类,当你编辑XAML。

+0

来自Bryant的答案(谢谢!),但VS2008中的XAML设计视图不会显示它。 您将收到错误:>错误无法创建类型为“MyControlBase”的实例。 – Jason 2010-01-18 23:10:10