2013-05-09 3 views
0

Я пытаюсь создать пользовательский RoutedEvent, чтобы вызвать анимацию всякий раз, когда изменяется свойство Text изменений TextBlock. Мой класс наследует от TextBlock класс, а я тень Text. Я использую Button, чтобы изменить свойство Text в каком-то другом значении. Мой код не вызывает ошибок, но ничего не делает. Я уверен, что проблема связана с событием TextChanged, потому что, когда я его заменю, скажем, MouseEnter, все работает нормально.Мое пользовательское событие ничего не производит

Public Class MyCustomTextBlock 
Inherits TextBlock 

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

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 System.Windows.RoutedEventArgs) 
     Me.RaiseEvent(e) 
    End RaiseEvent 
End Event 

Public Shared Shadows TextProperty As DependencyProperty = 
    DependencyProperty.Register("Text", GetType(String), GetType(MyCustomTextBlock), 
           New FrameworkPropertyMetadata(String.Empty, 
            New PropertyChangedCallback(AddressOf TextPropertyChanged))) 

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

XAML

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.Resources> 
    <Style TargetType="local:MyCustomTextBlock"> 
     <Style.Triggers> 
      <EventTrigger RoutedEvent="local:MyCustomTextBlock.TextChanged"> 
       <EventTrigger.Actions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="FontSize" To="30" Duration="0:0:1" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger.Actions> 
      </EventTrigger> 
     </Style.Triggers> 
    </Style>  
</Window.Resources> 

<Grid> 
    <local:MyCustomTextBlock x:Name="Textblock1" Text="xxxxxxxxx" Background="Yellow" Width="100" Height="25" /> 
    <Button Content="Change Text" Height="23" HorizontalAlignment="Left" Margin="217,218,0,0" Name="Button1" VerticalAlignment="Top" Width="75" /> 
</Grid> 

Class Main Window  
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As  
System.Windows.RoutedEventArgs) Handles Button1.Click 

    Textblock1.Text = "apollon" 
End Sub 
End Class 

ответ

0

Похоже, проблема в том, что вы создаете новых членов, что конфликт с теми, на базе TextBox. Вы должны рассмотреть возможность использования события TextChanged, которое уже существует на TextBox, или если вам действительно нужно, назовите его чем-то другим. Здесь вы пока ничего не делаете, что базовые свойства уже не делают для вас.

Основная проблема с вашим конкретным вопросом, хотя, по-видимому, связана с созданным вами новым TextProperty. Нельзя скрывать свойство зависимостей в базовом классе, прежде всего потому, что вы не можете контролировать, какой из них будет использоваться в каждой ситуации, но также и потому, что есть встроенные механизмы, чтобы сделать его ненужным. В вашем случае вы усугубили проблему, не полностью реализуя шаблонный код для DP. Поскольку у вас нет свойства оболочки, ваша настройка свойства Text из кода задает TextBox.Text, который внутренне вызывает SetValue с TextBox.TextProperty, поэтому полностью пропускает ваш код.

Вместо того, чтобы объявлять свои собственные TextProperty, вы можете просто привязать свои метаданные к существующему. Чтобы добавить обработчик изменений в существующее свойство, добавьте этот вызов в статический конструктор:

 TextProperty.OverrideMetadata(GetType(MyCustomTextBlock), 
          New FrameworkPropertyMetadata(String.Empty, 
          New PropertyChangedCallback(AddressOf TextPropertyChanged))) 
+0

Спасибо за ваш ответ! Я использую Textblock not Textbox ... поэтому в базовом классе нет события TextChanged. – apollon

+0

Итак, я попробовал ваш код, и он отлично работает. Спасибо большое отличное сообщение! – apollon

Смежные вопросы