2013-09-05 5 views
2

Я следовал this tutorial, но я не мог применить то, что я узнал в своем проекте.Как создать настраиваемое маршрутизируемое событие? WPF C#

У меня есть LineGraph объекта (Dynamic Data Display) и я хочу, чтобы создать событие, которое возникает, когда толщина рёберного графа равна 0.

Как я должен писать после этого урока?

+0

В чем проблема, с которой вы сталкиваетесь, почему вы не можете применить учебник? –

+1

Я не работаю D3, но кажется, что объект LineGraph не имеет свойства толщины? –

+0

Можете ли вы опубликовать некоторый код, чтобы мы могли понять, в чем проблема? –

ответ

3

Лично я обычно избегаю создания событий, предпочитая вместо этого создавать delegate. Если есть какая-то особая причина, по которой вам требуется конкретное событие, пожалуйста, проигнорируйте этот ответ. Причины, по которым я предпочитаю использовать delegate, - это то, что вам не нужно создавать дополнительные классы EventArgs, и я также могу установить свои собственные типы параметров.

Во-первых, давайте создадим делегат:

public delegate void TypeOfDelegate(YourDataType dataInstance); 

Теперь геттер и сеттер:

public TypeOfDelegate DelegateProperty { get; set; } 

Теперь давайте создадим метод, который соответствует и выезд из параметров delegate:

public void CanBeCalledAnything(YourDataType dataInstance) 
{ 
    // do something with the dataInstance parameter 
} 

Теперь мы можем установить этот метод как один (из многих) обработчиков для этого delegate:

DelegateProperty += CanBeCalledAnything; 

Наконец, давайте назовем наш delegate ... это эквивалентно повышением события:

if (DelegateProperty != null) DelegateProperty(dataInstanceOfTypeYourDataType); 

Примечания важной проверкой null. Итак, это все! Если вы хотите больше или меньше параметров, просто добавьте или удалите их из объявления delegate и способ обработки ... прост.

12

Вот как я хотел бы сделать это с RoutedEvent:

  1. Создать класс, производный от LineGraph, скажем CustomLineGraph:

    public class CustomLineGraph : LineGraph { 
    } 
    
  2. Создать наш маршрутизируемого событие так:

    public class CustomLineGraph : LineGraph { 
    
        public static readonly RoutedEvent ThicknessEvent = EventManager.RegisterRoutedEvent("Thickness", RoutingStrategy.Bubble, typeof(RoutedEventHandler, typeof(CustomLineGraph)); 
    
        // .NET event wrapper 
        public event RoutedEventHandler Thickness 
        { 
         add { AddHandler(CustomLineGraph.ThicknessEvent, value); } 
         remove { RemoveHandler(CustomLineGraph.ThicknessEvent, value); } 
        } 
    } 
    
  3. Теперь мы переопределяем e StrokeThickness, поэтому мы можем поднять наше настраиваемое маршрутизируемое событие, когда значение этого свойства равно 0.

    public class CustomLineGraph : LineGraph { 
    
        public static readonly RoutedEvent ThicknessEvent = EventManager.RegisterRoutedEvent("Thickness", RoutingStrategy.Bubble, typeof(RoutedEventHandler, typeof(CustomLineGraph)); 
    
        // .NET event wrapper 
        public event RoutedEventHandler Thickness 
        { 
         add { AddHandler(CustomLineGraph.ThicknessEvent, value); } 
         remove { RemoveHandler(CustomLineGraph.ThicknessEvent, value); } 
        } 
    
        public override double StrokeThickness { 
         get { return base.StrokeThickness; } 
         set 
         { 
          base.StrokeThickness = value; 
          if (value == 0) 
           RaiseEvent(new RoutedEventArgs(CustomLineGraph.ThicknessEvent, this)); 
         } 
        } 
    } 
    
  4. Мы готовы!

Смежные вопросы