5

Я хочу добавить пользовательские обработчики событий к элементам фрейма по умолчанию, используя DependencyProperties.Создать свойства зависимостей для установки пользовательских EventHandlers в XAML

Что-то вроде следующего:

<Border custom:MyProps.HandleMyEvent="someHandler">...</Border> 

Здесь приведен код для элемента управления, который содержит пограничный элемент:

public class MyPage : Page{ 
    public void someHandler(object sender, EventArgs e){ 
     //do something 
    } 
} 

Вот грубый пример того, как я себе класс, который определяет имущество:

public class MyProps{ 
    public event EventHandler MyInternalHandler; 
    public static readonly DependencyProperty HandleMyEventProperty = ... 
    public void SetHandleMyEvent(object sender, EventHandler e){ 
     MyInternalHandler += e; 
    } 
} 

Проблема в том, что я не знаю/не нашел подсказки, как объединить DependencyProperties с событиями/делегатами и EventHandlers.

У вас есть ключ?

+0

Можем ли мы получить намек на проблему, для которой это решение будет предназначаться? Если вы хотите добавить события к элементам фрейма по умолчанию, просто подкласс или используйте «Поведения». –

ответ

5

Я собираюсь предположить, что это не имеет ничего общего с WPF, это вопрос о серебристом свете.

Прежде всего, вы не можете просто добавить Event в существующий элемент управления. В конце концов вы добавляете прикрепленные Properties, тогда как события обрабатываются по-разному, они не являются свойствами.

Вам необходимо создать новый тип, который имеет это событие, а затем создать вложенное свойство этого типа.

Вот основной тип, который просто имеет событие: -

public class MyEventer 
{ 
    public event EventHandler MyEvent; 

    // What would call this?? 
    protected void OnMyEvent(EventArgs e) 
    { 
     if (MyEvent != null) 
     MyEvent(this, e); 
    } 
} 

Теперь мы создаем вложенное свойство, которое имеет MyEventer в качестве своей собственности, я предпочитаю, чтобы поместить их в отдельный статический класс.

public static class MyProps 
{ 

    public static MyEventer GetEventer(DependencyObject obj) 
    { 
    return (MyEventer)obj.GetValue(EventerProperty); 
    } 

    public static void SetEventer(DependencyObject obj, MyEventer value) 
    { 
    obj.SetValue(EventerProperty , value); 
    } 

    public static readonly DependencyProperty EventerProperty = 
     DepencencyProperty.RegisterAttached("Eventer", typeof(MyEventer), typeof(MyProps), null) 

    } 
} 

Теперь вы прикрепите к элементу управления, как это: -

<Border ...> 
    <custom:MyProps.Eventer> 
     <custom:MyEventer MyEvent="someHandler" /> 
    </custom:MyProps.Eventer> 
</Border> 

Если вы скомпилировать проект до написания этой XAML вы заметите, что Visual Studio предложит вам вариант для того, чтобы создать обработчик события в коде для вас.

Конечно, это по-прежнему оставляет важный вопрос: как вы намеревались вызвать событие?

+0

Событие запускается рамкой, которую я пишу. И, как вы правильно показали, мне нужна была некоторая функция OnMyEvent для простого запуска пользовательских обработчиков. Теперь пользователь может определить пользовательский обработчик или сгенерировать новый, используя вкладку в XAML. Очень приятно, даже если бы я предпочел прямой DependencyProperty без дополнительного ..> ..>. было бы очень приятно использовать. В любом случае, спасибо за ваш ценный вклад! :) – Juve

+0

Довольно плохое соглашение об именовании. –

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