C# 覆盖UseControl';s图书馆

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."); } }

我想开发一个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.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
。抱歉,这对我来说没有任何意义。我用一些代码编辑了我的原始答案。让我们确定需要更详细解释的具体概念。