2009-12-08 2 views
0

Я пишу пользовательский элемент управления textblock, который заполняет гиперссылки и вызывает событие при нажатии на гиперссылку.Поднятие события в пользовательском контроле

Я написал этот код, но я застрял.

Мой код:

Imports System.Text.RegularExpressions 
Public Class CustomTextBlock 
Inherits TextBlock 

Public Event Klik As EventHandler(Of EventArgs) 
Public ReadOnly InlineCollectionProperty As DependencyProperty = DependencyProperty.Register("InlineCollection", GetType(String), GetType(CustomTextBlock), New PropertyMetadata(New PropertyChangedCallback(AddressOf CustomTextBlock.InlineChanged))) 

Private Shared Sub InlineChanged(ByVal sender As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 

    DirectCast(sender, CustomTextBlock).Inlines.Clear() 

    Dim kelimeler = Split(e.NewValue, " ") 
    For i = 0 To kelimeler.Length - 1 
     If Regex.Match(kelimeler(i), "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?").Success Then 

      Dim x = New Hyperlink(New Run(kelimeler(i))) 
      x.AddHandler(Hyperlink.ClickEvent, New RoutedEventHandler(AddressOf t_Click)) 
      x.ToolTip = kelimeler(i) 
      x.Tag = kelimeler(i) 
      DirectCast(sender, CustomTextBlock).Inlines.Add(x) 
      If Not i = kelimeler.Length Then DirectCast(sender, CustomTextBlock).Inlines.Add(" ") 
     Else 
      DirectCast(sender, CustomTextBlock).Inlines.Add(kelimeler(i)) 
      If Not i = kelimeler.Length Then DirectCast(sender, CustomTextBlock).Inlines.Add(" ") 
     End If 
     ''//Console.WriteLine(kelime(i).ToString.StartsWith("@")) 
    Next 
    kelimeler = Nothing 
End Sub 
Public Property InlineCollection As String 
    Get 
     Return DirectCast(GetValue(InlineCollectionProperty), String) 
    End Get 
    Set(ByVal value As String) 
     SetValue(InlineCollectionProperty, value) 
    End Set 
End Property 

Private Shared Sub t_Click(ByVal sender As Hyperlink, ByVal e As System.Windows.RoutedEventArgs) 
    e.Handled = True 
    RaiseEvent Klik(sender, EventArgs.Empty) 
End Sub 
End Class 

Этот код дает ошибку в RaiseEvent Klik (отправитель, EventArgs.Empty)

Ошибка: Не удается обратиться к члену экземпляра класса внутри общего метода или инициатор разделяемого члена без эксплицитного экземпляра класса.

Спасибо за ваши ответы, Alper

ответ

0

Проблема четко указано в сообщении исключения. Метод t_Click является общим (что означает общее для всех экземпляров класса), поэтому он не может создать событие, специфичное для экземпляра класса. Вы должны только поднять событие из метода, который не используется совместно.

+0

нормально, но когда я удалить общий из t_Click я не могу добавить обработчик HYPERLINK с этим кодом: x.AddHandler (Hyperlink.ClickEvent, New RoutedEventHandler (AddressOf t_Click)) – SeSSiZ

+0

Это потому, что ваш InlineChanged Sub также разделен, поэтому он не может получить доступ к t_Click, который больше не разделяется. Поэтому вы также должны удалить ключевое слово Shared из InlineChanged. –

+0

Хорошо, но еще одна проблема: D Когда я удалил общедоступное ключевое слово из InlineChanged, получив ошибку в этой строке Public ReadOnly InlineCollectionProperty As DependencyProperty = DependencyProperty.Register («InlineCollection», GetType (String), GetType (CustomTextBlock), New PropertyMetadata (New PropertyChangedCallback (AddressOf CustomTextBlock.InlineChanged))) в этой части: AddressOf CustomTextBlock.InlineChanged Ошибка: ссылка на не разделяемый элемент требует ссылки на объект. Еще раз спасибо :( – SeSSiZ

0

ли что-то вроде этого -

Imports System 
Imports System.Text.RegularExpressions 
Public Class CustomTextBlock 
    Inherits TextBlock 

    Public Event Klik As EventHandler(Of System.EventArgs) 
    Public ReadOnly InlineCollectionProperty As DependencyProperty = DependencyProperty.Register("InlineCollection", GetType(String), GetType(CustomTextBlock), New PropertyMetadata(New PropertyChangedCallback(AddressOf CustomTextBlock.InlineChanged))) 

    Private Shared Sub InlineChanged(ByVal sender As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
     Dim d As CustomTextBlock = DirectCast(sender, CustomTextBlock) 
     d.Inlines.Clear() 
     d.OnInlineChanged(CType(e.NewValue, String)) 
    End Sub 

    Private Sub OnInlineChanged(ByVal Value As String) 
     Dim kelimeler = Split(Value, " ") 

     For i As Integer = 0 To kelimeler.Length - 1 
      If Regex.Match(kelimeler(i), "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?").Success Then 
       Dim x = New Hyperlink(New Run(kelimeler(i))) 
       x.AddHandler(Hyperlink.ClickEvent, New RoutedEventHandler(AddressOf t_Click)) 
       x.ToolTip = kelimeler(i) 
       x.Tag = kelimeler(i) 
       Me.Inlines.Add(x) 
       If Not i = kelimeler.Length Then Me.Inlines.Add(" ") 
      Else 
       Me.Inlines.Add(kelimeler(i)) 
       If Not i = kelimeler.Length Then Me.Inlines.Add(" ") 
      End If 
      ''//Console.WriteLine(kelime(i).ToString.StartsWith("@")) 
     Next 
     kelimeler = Nothing 
    End Sub 

    Public Property InlineCollection As String 
     Get 
      Return DirectCast(GetValue(InlineCollectionProperty), String) 
     End Get 
     Set(ByVal value As String) 
      SetValue(InlineCollectionProperty, value) 
     End Set 
    End Property 

    Private Sub t_Click(ByVal sender As Hyperlink, ByVal e As System.Windows.RoutedEventArgs) 
     e.Handled = True 
     RaiseEvent Klik(sender, System.EventArgs.Empty) 
    End Sub 
End Class