我想开发一个WPF用户控件库,该库使用具有可以被覆盖的成员函数的类库。我正在使用C#4.0和VS 2010。
我的测试类库看起来像:
using System.Diagnostics;
namespace MyLibrary {
public class Foo {
virtual public void Bar() {
Debug.WriteLine(" Hi from MyLibrary, class Foo, method Bar.");
}
}
}
我的WPF用户控件如下所示:
using System.Windows.Controls;
using System.Diagnostics;
using MyLibrary;
namespace MyUserControl {
public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
Debug.WriteLine("MyUserControl: ");
var foo = new Foo();
foo.Bar();
}
}
}
我已经构建了一个名为ProgramA的WPF应用程序,它看起来像:
using System;
using System.Diagnostics;
using System.Windows;
namespace ProgramA {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
调试ProgramA时,您会看到:
MyUserControl:
Hi from MyLibrary, class Foo, method Bar.
在调试输出窗口中。到目前为止,非常好。
我还构建了ProgramB来尝试覆盖MyLibrary的Bar方法。 ProgramB看起来像:
using System.Windows;
namespace ProgramB {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
ProgramA和ProgramB的XML都包含对MyUserControl的引用:
<Window x:Class="ProgramB.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:MyUserControl;assembly=MyUserControl">
<Grid>
<my:UserControl1 Name="userControl11"
HorizontalAlignment="Left"
VerticalAlignment="Top" />
</Grid>
</Window>
我在ProgramB的项目NewFoo.cs中添加了一个Class,它看起来像:
using System.Diagnostics;
using MyLibrary;
namespace ProgramB {
class NewFoo : MyLibrary.Foo{
override public void Bar() {
Debug.WriteLine(" Hi from ProgramB Foo, method Bar.");
}
}
}
ProgramB编译并运行,但输出为:
MyUserControl:
Hi from library Foo, method Bar.
覆盖不起作用。
这是问题所在。 ProgramB的Foo方法的命名空间是ProgramB,因此它不会覆盖MyLibrary的Bar方法。
ProgramB是否可以覆盖MyUserControl使用的Bar方法?
任何帮助或建议将不胜感激。 查尔斯
答案 0 :(得分:0)
因为UserControl1
不了解NewFoo
而只是实例化Foo
。它与名称空间无关。
只要您提供正确的实例,覆盖就会起作用。
您应该在UserControl1
中公开一个属性,您可以在其中设置要使用的foo
。