событие в производном классе - PullRequest
0 голосов
/ 18 октября 2011

Я объявил событие в своем классе UserControl Main:

public static readonly RoutedEvent CloseEvent = EventManager.RegisterRoutedEvent(
    "CloseClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Main));
public event RoutedEventHandler CloseClick
{
    add { AddHandler(CloseEvent, value); }
    remove { RemoveHandler(CloseEvent, value); }
}

Этот код должен быть действительным, поскольку я использовал его в других классах.Проблема в том, что я пытаюсь прослушать событие в другом классе.

UserControl content;
if (value == "main")
{
    content = new Main();
    content.CloseClick += new RoutedEventHandler(closeClick);
} else {
    ...
    ...
}
MasterPage.addContent(content);

Я хочу, чтобы «содержимое» было любого типа, производного от UserControl.Если я объявляю «content» как тип «Main», событие обнаруживается, но если оно объявлено как BaseClass «UserControl», все, кроме события, работает.Я что-то упустил?

Ответы [ 3 ]

1 голос
/ 18 октября 2011

Вот как это должно работать правильно. Я имею в виду Main - правильный тип источника этого события, а не UserControl (который может быть любым).

Если вы хотите, чтобы событие вызывалось для любого userControl, создайте Attached Routed Events . Они могут быть вызваны из любого объекта DependencyObject (т.е. Main или базового UserControl или обоих).

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

вы можете сначала определить базовый класс и поместить в него событие CloseClick.и тогда ваши другие пользовательские элементы управления наследуют этот базовый класс

class MyBaseUserControl : UserControl
{
    public static readonly RoutedEvent CloseEvent = EventManager.RegisterRoutedEvent(
    "CloseClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Main));
    public event RoutedEventHandler CloseClick
    {
        add { AddHandler(CloseEvent, value); }
        remove { RemoveHandler(CloseEvent, value); }
    }
}

MyBaseUserControl content;
if (value == "main")
{
    content = new Main();
    content.CloseClick += new RoutedEventHandler(closeClick);
} else {
    ...
    ...
}
MasterPage.addContent(content);
0 голосов
/ 18 октября 2011

Не знаю, хорошо ли я понял твой вопрос. Я думаю, что вы приводите производный класс к его базовому классу, а затем пытаетесь использовать событие, присутствующее в производном классе.

Если «Main» происходит от UserControl, и вы объявляете «Main» объект как «UserControl», должны быть доступны только методы, свойства и события базового класса (те, которые присутствуют в «UserControl»). Это то, что называется унынием.

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