Пользовательские прикрепленные события в WPF - PullRequest
3 голосов
/ 13 июля 2009

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

В Surface SDK вы можете делать такие вещи, как:

<Grid Background="{StaticResource WindowBackground}" x:Name="Foo" s:SurfaceFrameworkElement.ContactChanged="Foo_ContactChanged"/>

Я хочу создать пользовательское событие, для которого обработчик может быть добавлен в XAML таким же образом, но у меня возникли проблемы.

Я могу создать пользовательское перенаправленное событие, но intellisense XAML его не видит, и обработчик событий не добавляется, если я просто набираю его регулярно. Вот мое определение события:

public static class TagRectEvents
{
    public static readonly RoutedEvent TagRectEnterEvent = EventManager.RegisterRoutedEvent(
        "TagRectEnter", RoutingStrategy.Bubble, typeof( RoutedEventHandler ), typeof( TagRectEvents ) );

    public static void AddTagRectEnterHandler( DependencyObject d, RoutedEventHandler handler )
    {
        UIElement element = d as UIElement;
        if ( element == null )
        {
            return;
        }
        element.AddHandler( TagRectEvents.TagRectEnterEvent, handler );
    }

    public static void RemoveTagRectEnterHandler( DependencyObject d, RoutedEventHandler handler )
    {
        UIElement element = d as UIElement;
        if ( element == null )
        {
            return;
        }
        element.RemoveHandler( TagRectEvents.TagRectEnterEvent, handler );
    }
}

Я просто ошибаюсь? Все примеры «прикрепленного поведения», которые я вижу, больше касаются добавления присоединенного свойства, а затем выполнения действий с элементами, которые устанавливают это свойство.

Ответы [ 2 ]

1 голос
/ 26 февраля 2016

Вы должны либо не отображать пространство имен, и / или присоединять событие, подобное local:TagRectEvents.TagRectEnterEvent. Вы должны использовать TagRectEnter, а не TagRectEnterEvent.

Отображение пространства имен:

 xmlns:local="clr-namespace:WpfInfrastructure.WpfAttachedEvents"

Использование:

<Button Content="Press" local:TagRectEvents.TagRectEnter="MyHandler" Margin="25,43,36,161" />

Обработчик:

    public void MyHandler(object sender, RoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Hurray!");
    }

Я использовал ваш код, здесь он работает правильно.

0 голосов
/ 11 августа 2010

Для того, чтобы присоединенное событие отображалось в Intellisense, оно должно быть в классе, который находится в сателлитной сборке, или в библиотеке .dll. Самый простой способ добавить библиотеку - добавить проект «Библиотека пользовательских элементов управления WPF» в ваше решение. Использование библиотеки элементов управления Wpf просто гарантирует, что все типичные ссылки будут добавлены автоматически (чего не происходит в библиотеке классов C #). Вы можете удалить CustomControl1.cs так же, как вы удалите связанный с ним стиль в Themes / Generic. XAML.

...