自定义路由事件示例

时间:2012-11-08 23:05:24

标签: wpf

我需要一个完整的示例如何声明...并在使用它之后自定义路由事件。     其实我知道语法,但我不知道如何使它工作以及如何使用它     后来。你能给我一个简单的完整例子(vb代码对我来说更好)。     例如,单击按钮以在标签上显示文本。

1 个答案:

答案 0 :(得分:0)

这是我使用自定义RoutedEvent的一种简单方法:只要Text的{​​{1}}属性发生更改(TextChanged事件),就触发动画:

在这个例子中,我创建了一个派生自TextBlock的类。出于本演示的目的,我们将其称为TextBlock

首先我们定义MyCustomTextBlock

RoutedEvent

我们定义了RoutedEeventHandler:

Public Shared ReadOnly TextChangedEvent As RoutedEvent = EventManager.RegisterRoutedEvent("TextChanged", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(MyCustomTextBlock))

接下来,SHADOW Public Custom Event TextChanged As RoutedEventHandler AddHandler(ByVal value As RoutedEventHandler) Me.AddHandler(TextChangedEvent, value) End AddHandler RemoveHandler(ByVal value As RoutedEventHandler) Me.RemoveHandler(TextChangedEvent, value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As RoutedEventArgs) Me.RaiseEvent(e) End RaiseEvent End Event 属性声明,以便您可以指定一个Callback方法:

Text

编辑:在上面的Public Shared Shadows TextProperty As DependencyProperty = DependencyProperty.Register("Text", GetType(String), MethodBase.GetCurrentMethod().DeclaringType, New FrameworkPropertyMetadata(String.Empty, New PropertyChangedCallback(AddressOf TextPropertyChanged))) 注册中,我使用DependencyProperty来获取调用类型,因为我使用代码段来注入Reflection注册调用,这使我的代码段更具动态性。如果您不想导入DependencyProperty

,可以使用以下内容替换上述调用
Reflection Namespace

定义每当Public Shared Shadows TextProperty As DependencyProperty = DependencyProperty.Register("Text", GetType(String), GetType(MyCustomTextBlock), New FrameworkPropertyMetadata(String.Empty, New PropertyChangedCallback(AddressOf TextPropertyChanged))) 值更改时执行的回调方法,提升Text

RoutedEvent

这就是代码的全部内容,现在让我们在XAML中使用它:

Private Shared Sub TextPropertyChanged(ByVal Sender As Object, ByVal e As DependencyPropertyChangedEventArgs)
    DirectCast(Sender, MyCustomTextBlock).RaiseEvent(New RoutedEventArgs(MyCustomTextBlock.TextChangedEvent))
End Sub

在上面的触发器中,我只是将<local:MyCustomTextBlock> <local:MyCustomTextBlock.Style> <Style TargetType="local:MyCustomTextBlock"> <Style.Triggers> <EventTrigger RoutedEvent="local:MyCustomTextBlock.TextChanged"> <BeginStoryboard> <Storyboard> <DoubleAnimation To="1.5" Duration="0:0:0.1" Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)" AutoReverse="True"/> <DoubleAnimation To="1.5" Duration="0:0:0.1" Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)" AutoReverse="True"/> </Storyboard> </BeginStoryboard> </EventTrigger> </Style.Triggers> </Style> </local:MyCustomTextBlock.Style> </local:MyCustomTextBlock> 的大小放大,然后向后缩小,所有这些都在200毫秒内,这为用户提供了一个文本已经改变的微妙姿势,将他们的注意力转移到新的值。

另外,如果您还没有,请在您的xaml页面顶部引用您的程序集:

TextBlock

为了简单起见,让VisualStudio为您提供连接。如果您键入<Window x:Class="MyWindow" xmlns:local="clr-namespace:MyRoutedEventProject"/> ,那么Intellisense应弹出一个名称空间列表供您选择。找到项目的基本命名空间并插入它:

enter image description here

这是xmlns:local=的简单用法,但是我经常使用的真实用例。我希望它有所帮助。