覆盖UseControl的库

时间:2011-10-31 19:05:13

标签: c# wpf

我想开发一个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方法?

任何帮助或建议将不胜感激。 查尔斯

1 个答案:

答案 0 :(得分:0)

因为UserControl1不了解NewFoo而只是实例化Foo。它与名称空间无关。

只要您提供正确的实例,覆盖就会起作用。

您应该在UserControl1中公开一个属性,您可以在其中设置要使用的foo