我需要一个完整的示例如何声明..并在使用它之后自定义路由事件。实际上我知道语法,但我不知道如何使它工作以及以后如何使用它。你能给我简单的完整例子吗(vb代码对我来说更好)。例如,单击按钮以在标签上显示文本时。
1 回答
这是我使用自定义的一种简单方法:每当属性更改RoutedEvent
时触发动画(TextChanged 事件):Text
TextBlock
在这种情况下,我创建了一个派生自TextBlock
. 出于本演示的目的,我们将其命名为MyCustomTextBlock
。
首先我们定义RoutedEvent
:
Public Shared ReadOnly TextChangedEvent As RoutedEvent = EventManager.RegisterRoutedEvent("TextChanged", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(MyCustomTextBlock))
我们定义了RoutedEeventHandler:
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
接下来,SHADOWText
属性声明,以便您可以指定回调方法:
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
:
Private Shared Sub TextPropertyChanged(ByVal Sender As Object, ByVal e As DependencyPropertyChangedEventArgs)
DirectCast(Sender, MyCustomTextBlock).RaiseEvent(New RoutedEventArgs(MyCustomTextBlock.TextChangedEvent))
End Sub
这就是代码的全部内容,现在让我们在 XAML 中使用它:
<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>
在上面的触发器中,我只是TextBlock
在 200 毫秒内放大然后缩小的大小,这给用户一个微妙的手势,即文本已经改变,将他们的注意力带到新的值上。
此外,如果您还没有,请在您的 xaml 页面顶部引用您的程序集:
<Window x:Class="MyWindow"
xmlns:local="clr-namespace:MyRoutedEventProject"/>
为简单起见,让 VisualStudio 为您连接起来。如果您键入xmlns:local=
,则 Intellisense 应该会弹出一个名称空间列表以供选择。找到项目的基本命名空间并将其插入:
这是一个简单的使用RoutedEvent
,但我经常使用的现实生活用例。我希望它有所帮助。