C# 覆盖UseControl';s图书馆
我想开发一个WPF用户控件库,它使用一个类库,该类库带有一个可以被覆盖的成员函数。我使用的是C#4.0和VS2010 我的测试类库如下所示:C# 覆盖UseControl';s图书馆,c#,wpf,C#,Wpf,我想开发一个WPF用户控件库,它使用一个类库,该类库带有一个可以被覆盖的成员函数。我使用的是C#4.0和VS2010 我的测试类库如下所示: using System.Diagnostics; namespace MyLibrary { public class Foo { virtual public void Bar() { Debug.WriteLine(" Hi from MyLibrary, class Foo, method Bar."); } }
using System.Diagnostics;
namespace MyLibrary {
public class Foo {
virtual public void Bar() {
Debug.WriteLine(" Hi from MyLibrary, class Foo, method Bar.");
}
}
}
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();
}
}
}
using System;
using System.Diagnostics;
using System.Windows;
namespace ProgramA {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Windows;
namespace ProgramB {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Diagnostics;
using MyLibrary;
namespace ProgramB {
class NewFoo : MyLibrary.Foo{
override public void Bar() {
Debug.WriteLine(" Hi from ProgramB Foo, method Bar.");
}
}
}
我的WPF用户控件看起来像:
using System.Diagnostics;
namespace MyLibrary {
public class Foo {
virtual public void Bar() {
Debug.WriteLine(" Hi from MyLibrary, class Foo, method Bar.");
}
}
}
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();
}
}
}
using System;
using System.Diagnostics;
using System.Windows;
namespace ProgramA {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Windows;
namespace ProgramB {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Diagnostics;
using MyLibrary;
namespace ProgramB {
class NewFoo : MyLibrary.Foo{
override public void Bar() {
Debug.WriteLine(" Hi from ProgramB Foo, method Bar.");
}
}
}
我已经构建了一个名为ProgramA的WPF应用程序,它看起来像:
using System.Diagnostics;
namespace MyLibrary {
public class Foo {
virtual public void Bar() {
Debug.WriteLine(" Hi from MyLibrary, class Foo, method Bar.");
}
}
}
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();
}
}
}
using System;
using System.Diagnostics;
using System.Windows;
namespace ProgramA {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Windows;
namespace ProgramB {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Diagnostics;
using MyLibrary;
namespace ProgramB {
class NewFoo : MyLibrary.Foo{
override public void Bar() {
Debug.WriteLine(" Hi from ProgramB Foo, method Bar.");
}
}
}
调试ProgramA时,您将看到:
MyUserControl:
Hi from MyLibrary, class Foo, method Bar.
在“调试输出”窗口中。到目前为止,一切顺利
我还构建了ProgramB,试图覆盖MyLibrary的Bar方法。
程序B看起来像:
using System.Diagnostics;
namespace MyLibrary {
public class Foo {
virtual public void Bar() {
Debug.WriteLine(" Hi from MyLibrary, class Foo, method Bar.");
}
}
}
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();
}
}
}
using System;
using System.Diagnostics;
using System.Windows;
namespace ProgramA {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Windows;
namespace ProgramB {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
}
using System.Diagnostics;
using MyLibrary;
namespace ProgramB {
class NewFoo : MyLibrary.Foo{
override public void Bar() {
Debug.WriteLine(" Hi from ProgramB Foo, method Bar.");
}
}
}
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编译并运行,但输出为:
MyUserControl:
Hi from library Foo, method Bar.
超控无效
问题就在这里。ProgramB的Foo方法的名称空间是ProgramB,因此它不会覆盖MyLibrary的Bar方法
ProgramB有没有办法覆盖MyUserControl使用的Bar方法
任何帮助或建议都将不胜感激。
Charles这是因为
UserControl1
不知道NewFoo
,只实例化Foo
。它与名称空间无关
只要您提供了正确的实例,覆盖就会起作用
您应该在
UserControl1
中公开一个属性,您可以在其中设置要使用的foo
。可能会对您有所帮助。在实际应用程序中,我无法这样做,因为NewFoo使用的是程序a未加载的其他方法。如果您的要求是UserControl1
调用类型为Foo
的变量执行NewFoo.Bar
中的代码,然后ProgramB
中的某些代码必须创建NewFoo的实例并引用UserControl1
。抱歉,这对我来说没有任何意义。我用一些代码编辑了我的原始答案。让我们确定需要更详细解释的具体概念。