Я пишу пользовательский элемент управления 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
нормально, но когда я удалить общий из t_Click я не могу добавить обработчик HYPERLINK с этим кодом: x.AddHandler (Hyperlink.ClickEvent, New RoutedEventHandler (AddressOf t_Click)) – SeSSiZ
Это потому, что ваш InlineChanged Sub также разделен, поэтому он не может получить доступ к t_Click, который больше не разделяется. Поэтому вы также должны удалить ключевое слово Shared из InlineChanged. –
Хорошо, но еще одна проблема: 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