【问题标题】:Visual Studio overwriting UserControl parent when not inheriting System.Windows.Controls.UserControlVisual Studio 在不继承 System.Windows.Controls.UserControl 时覆盖 UserControl 父级
【发布时间】:2010-12-11 13:27:58
【问题描述】:

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

System.Windows.Controls.UserControl

我在 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 有一种方法可以让我,我只是看不到我缺少什么。或者从 System.Windows.Controls.UserControl 之外的另一个类继承的 UserControl 的概念是一个糟糕的概念?

【问题讨论】:

  • 类定义行和初始 XAML 的实际代码示例会有所帮助。
  • 我添加了一些代码示例,也许这会有所帮助。

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


【解决方案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 时不断更改基类的原因。

【讨论】:

  • Bryant 的答案有效(谢谢!)但 VS2008 中的 XAML 设计视图不会显示它。您将收到一个错误:> 错误 20 无法创建类型为“MyControlBase”的实例。
猜你喜欢
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
相关资源
最近更新 更多