2012-11-08 62 views
1

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

+0

'Button.Click'已经是'RoutedEvent'了。如果你想给一个'Label'元素指定一个文本值,只需要对该按钮的'Click'事件作出响应......? – XamlZealot

+0

其实我不想给一个Label分配一个文本值。我只需要一个完整的例子来说明如何声明和使用它之后的自定义路由事件。 – apollon

回答

0

这里是我使用的自定义RoutedEvent一个简单的方法:要触发时的TextBlock变化(TextChanged事件)的Text属性动画:

在这种情况下我已经创建了从0​​派生的类。为了演示的目的,我们将其称为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 

接下来,阴影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

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> 

在上面的触发器中,我只是sca将尺寸缩小为TextBlock,然后再向下,所有这些都在200毫秒内,这给用户一种微妙的手势,文字已经改变,将他们的注意力引向新的价值。

另外,如果您还没有准备好,在你的XAML页面的顶部引用您的装配:

<Window x:Class="MyWindow" 
    xmlns:local="clr-namespace:MyRoutedEventProject"/> 

对于纯朴的缘故,让VisualStudio的钩它给你的。如果您输入xmlns:local=,则Intellisense应弹出可供选择的命名空间列表。找到你的项目的基础命名空间和插入:

enter image description here

这是一个简单的采用了RoutedEvent的,但我经常使用一个现实生活中的使用情况。我希望它有帮助。