不继承System.Windows.Controls.UserControl时,Visual Studio会覆盖UserControl父级

时间:2009-10-30 10:11:46

标签: visual-studio visual-studio-2008 silverlight user-controls code-generation

我正在创建一系列UserControl,它们都有一些类似的业务逻辑。所以我尝试在一个抽象基类中实现这个通用业务逻辑,所有这些用户控件都将从中继承。继承链看起来像这样:

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

我在Visual Studio中创建了MyControl1,MyControl2等类作为用户控件。我已经将类设置为从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
    }

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

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

1 个答案:

答案 0 :(得分:1)

您需要将xaml更改为从MyControlBase而不是UserControl继承:

<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时不断更改基类的原因。