Переопределить библиотеку UseControl - PullRequest
0 голосов
/ 31 октября 2011

Я хотел бы разработать библиотеку управления пользователями 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();
    }
  }
}

Я создал приложение WPF с именем ProgramA, и оно выглядит так:

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, чтобы попытаться переопределить метод Bar в MyLibrary. ProgramB выглядит так:

using System.Windows;
namespace ProgramB {
  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
    }
  }
}

XML для ProgramA и ProgramB содержит ссылку на 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, и он выглядит так:

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.

Переопределение не сработало.

Вот проблема. Пространство имен для метода FB в ProgramB - это ProgramB, и, следовательно, оно не переопределяет метод Bar в MyLibrary.

Есть ли способ, которым ProgramB может переопределить метод Bar, используемый MyUserControl?

Любая помощь или предложения будут с благодарностью. Charles

1 Ответ

0 голосов
/ 31 октября 2011

Это потому, что UserControl1 не знает о NewFoo и только создает экземпляр Foo.Он не имеет ничего общего с пространствами имен.

Переопределение будет работать, если вы предоставите правильный экземпляр.

Вы должны выставить свойство в UserControl1, где вы можете указать, какое foo использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...