我正在创建一系列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一个坏概念?
答案 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时不断更改基类的原因。