1

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

4

1 回答 1

0

这是我使用自定义的一种简单方法:每当属性更改RoutedEvent时触发动画(TextChanged 事件):TextTextBlock

在这种情况下,我创建了一个派生自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,但我经常使用的现实生活用例。我希望它有所帮助。

于 2012-11-09T14:02:37.967 回答