Özel yönlendirilmiş bir olayı nasıl oluşturursunuz (WPF .NET)
Makale
Windows Presentation Foundation (WPF) uygulama geliştiricileri ve bileşen yazarları, ortak dil çalışma zamanı (CLR) olaylarının işlevselliğini genişletmek için özel yönlendirilmiş olaylar oluşturabilir. Yönlendirilmiş olay özellikleri hakkında bilgi için bkz. Yönlendirilmiş olaylar neden kullanılır. Bu makale, özel yönlendirilmiş olay oluşturmanın temellerini kapsar.
Önkoşullar
Makalede yönlendirilmiş olaylar hakkında temel bilgilere sahip olduğunuz ve Yönlendirilmiş olaylara genel bakışokuduğunuz varsayılmaktadır. Bu makaledeki örnekleri takip etmek için, Genişletilebilir Uygulama biçimlendirme dili (XAML) hakkında bilgi sahibi olmanız ve Windows Presentation Foundation (WPF) uygulamalarının nasıl yazıldığından haberdar olmanız yardımcı olur.
Yönlendirilmiş olay adımları
Yönlendirilmiş olay oluşturmanın temel adımları şunlardır:
Kayıt çağrısı, kayıtlı olay adını, yönlendirme stratejisinive diğer olay ayrıntılarını tutan yönlendirilmiş olay tanımlayıcısı olarak bilinen bir RoutedEvent örneği döndürür. Tanımlayıcıyı statik salt okunur bir alana atayın. Kurala göre:
kabarcık oluşturma stratejisine sahip yönlendirilmiş olayın tanımlayıcısı <event name>Eventolarak adlandırılır. Örneğin, olay adı Tap tanımlayıcı TapEventolarak adlandırılmalıdır.
tünelleme stratejisine sahip yönlendirme olayının tanımlayıcısı Preview<event name>Eventolarak adlandırılır. Örneğin, olay adı Tap tanımlayıcı PreviewTapEventolarak adlandırılmalıdır.
CLR tanımlayın ekleyin ve olay erişimcilerini kaldırın . CLR olay erişimcileri olmadan, yalnızca UIElement.AddHandler ve UIElement.RemoveHandler yöntemlerine doğrudan çağrılar aracılığıyla olay işleyicileri ekleyebilir veya kaldırabilirsiniz. CLR olay erişimcileri ile şu olay işleyicisi atama mekanizmalarını kazanırsınız:
Genişletilebilir Uygulama biçimlendirme dili (XAML) için, olay işleyicileri eklemek için öznitelik söz dizimlerini kullanabilirsiniz.
C# için, olay işleyicileri eklemek veya kaldırmak için += ve -= işleçlerini kullanabilirsiniz.
VB için, olay işleyicileri eklemek veya kaldırmak için AddHandler ve RemoveHandler deyimlerini kullanabilirsiniz.
Tetiklenecek yönlendirilmiş olayınız için özel mantık ekleyin. Örneğin, mantığınız kullanıcı girişi ve uygulama durumuna göre olayı tetikleyebilir.
Örnek
Aşağıdaki örnek, özel denetim kitaplığında CustomButton sınıfını uygular.
CustomButton sınıfı, Button'den türetilmiştir.
Kayıt çağrısından döndürülen RoutedEvent örneğini, ConditionalClickEventadlı statik, salt okunur bir alana atar.
CLR'yi tanımlar ekler ve olay erişimcilerini kaldırır.
CustomButton tıklandığında ve bir dış koşul uygulandığında özel bir rotalı olayı tetiklemek için özel bir mantık ekler. Örnek kod, geçersiz kılınan OnClick sanal yönteminin içinden yönlendirilmiş ConditionalClick olayı tetiklese de, olayınızı istediğiniz şekilde tetikleyebilirsiniz.
C#
publicclassCustomButton : Button
{
// Register a custom routed event using the Bubble routing strategy.publicstaticreadonly RoutedEvent ConditionalClickEvent = EventManager.RegisterRoutedEvent(
name: "ConditionalClick",
routingStrategy: RoutingStrategy.Bubble,
handlerType: typeof(RoutedEventHandler),
ownerType: typeof(CustomButton));
// Provide CLR accessors for assigning an event handler.publicevent RoutedEventHandler ConditionalClick
{
add { AddHandler(ConditionalClickEvent, value); }
remove { RemoveHandler(ConditionalClickEvent, value); }
}
voidRaiseCustomRoutedEvent()
{
// Create a RoutedEventArgs instance.
RoutedEventArgs routedEventArgs = new(routedEvent: ConditionalClickEvent);
// Raise the event, which will bubble up through the element tree.
RaiseEvent(routedEventArgs);
}
// For demo purposes, we use the Click event as a trigger.protectedoverridevoidOnClick()
{
// Some condition combined with the Click event will trigger the ConditionalClick event.if (DateTime.Now > new DateTime())
RaiseCustomRoutedEvent();
// Call the base class OnClick() method so Click event subscribers are notified.base.OnClick();
}
}
Public Class CustomButton
Inherits Button
' Register a custom routed event with the Bubble routing strategy.
Public Shared ReadOnly ConditionalClickEvent As RoutedEvent = EventManager.RegisterRoutedEvent(
name:="ConditionalClick",
routingStrategy:=RoutingStrategy.Bubble,
handlerType:=GetType(RoutedEventHandler),
ownerType:=GetType(CustomButton))
' Provide CLR accessors to support event handler assignment.
Public Custom Event ConditionalClick As RoutedEventHandler
AddHandler(value As RoutedEventHandler)
[AddHandler](ConditionalClickEvent, value)
End AddHandler
RemoveHandler(value As RoutedEventHandler)
[RemoveHandler](ConditionalClickEvent, value)
End RemoveHandler
RaiseEvent(sender As Object, e As RoutedEventArgs)
[RaiseEvent](e)
End RaiseEvent
End Event
Private Sub RaiseCustomRoutedEvent()
' Create a RoutedEventArgs instance.
Dim routedEventArgs As New RoutedEventArgs(routedEvent:=ConditionalClickEvent)
' Raise the event, which will bubble up through the element tree.
[RaiseEvent](routedEventArgs)
End Sub
' For demo purposes, we use the Click event as a trigger.
Protected Overrides Sub OnClick()
' Some condition combined with the Click event will trigger the ConditionalClick event.
If Date.Now > New DateTime() Then RaiseCustomRoutedEvent()
' Call the base class OnClick() method so Click event subscribers are notified.
MyBase.OnClick()
End Sub
End Class
Örnek, XAML işaretlemesi kullanarak bir CustomButton örneğini bir StackPanel'e ekleyen ve CustomButton ile StackPanel1 öğeleri için Handler_ConditionalClick yöntemini ConditionalClick olay işleyicisi olarak atayan ayrı bir WPF uygulaması içerir.
XAML
<Windowx:Class="CodeSample.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:custom="clr-namespace:WpfControl;assembly=WpfControlLibrary"Title="How to create a custom routed event"Height="100"Width="300"><StackPanelName="StackPanel1"custom:CustomButton.ConditionalClick="Handler_ConditionalClick"><custom:CustomButtonName="customButton"ConditionalClick="Handler_ConditionalClick"Content="Click to trigger a custom routed event"Background="LightGray"></custom:CustomButton></StackPanel></Window>
Arka planda kodda WPF uygulaması Handler_ConditionalClick olay işleyici yöntemini tanımlar. Olay işleyicisi yöntemleri yalnızca arka planda kodla uygulanabilir.
C#
// The ConditionalClick event handler.privatevoidHandler_ConditionalClick(object sender, RoutedEventArgs e)
{
string senderName = ((FrameworkElement)sender).Name;
string sourceName = ((FrameworkElement)e.Source).Name;
Debug.WriteLine($"Routed event handler attached to {senderName}, " +
$"triggered by the ConditionalClick routed event raised on {sourceName}.");
}
// Debug output when CustomButton is clicked:// Routed event handler attached to CustomButton,// triggered by the ConditionalClick routed event raised on CustomButton.// Routed event handler attached to StackPanel1,// triggered by the ConditionalClick routed event raised on CustomButton.
' The ConditionalClick event handler.
Private Sub Handler_ConditionalClick(sender As Object, e As RoutedEventArgs)
Dim sourceName As String = CType(e.Source, FrameworkElement).Name
Dim senderName As String = CType(sender, FrameworkElement).Name
Debug.WriteLine($"Routed event handler attached to {senderName}, " +
$"triggered by the ConditionalClick routed event raised on {sourceName}.")
End Sub
' Debug output when CustomButton is clicked:
' Routed event handler attached to CustomButton,
' triggered by the ConditionalClick routed event raised on CustomButton.
' Routed event handler attached to StackPanel1,
' triggered by the ConditionalClick routed event raised on CustomButton.
CustomButton tıklandığında:
yönlendirilen ConditionalClick olay CustomButtonüzerinde oluşturulur.
Handler_ConditionalClick'ya bağlı olan CustomButton olay işleyicisi tetiklendi.
ConditionalClick yönlendirilen olay, öğe ağacında yukarı doğru ilerleyerek StackPanel1'e ulaşır.
Handler_ConditionalClick olay işleyicisi StackPanel1'e bağlı olarak tetiklenir.
Yönlendirilen ConditionalClick olayı, potansiyel olarak öğe ağacında yukarı doğru devam ederek diğer çapraz geçiş öğelerine bağlı olan diğer ConditionalClick olay işleyicilerini tetikleyebilir.
Handler_ConditionalClick olay işleyicisi, olayı tetikleyen olay hakkında aşağıdaki bilgileri elde eder:
başlangıçta olayı tetikleyen öğe olan RoutedEventArgs.Source nesnesi. Bu örnekte, Source her zaman CustomButton.
Not
Yönlendirilen bir olay ile CLR olayı arasındaki önemli fark, yönlendirilen bir olayın öğe ağacından işleyicileri arayarak geçmesidir, ancak CLR olayı öğe ağacını dolaşmaz ve işleyiciler yalnızca olayı oluşturan kaynak nesneye bağlanabilir. Sonuç olarak, yönlendirilmiş olay sender öğe ağacındaki herhangi bir çapraz geçiş öğesi olabilir.
Bir tünel olayını kabarcık olayıyla aynı şekilde oluşturabilirsiniz, ancak olay kayıt çağrısında yönlendirme stratejisini Tunnelolarak ayarlayacaksınız. Tünel olayları hakkında daha fazla bilgi için bkz. WPF giriş olayları.
Bu içeriğin kaynağı GitHub'da bulunabilir; burada ayrıca sorunları ve çekme isteklerini oluşturup gözden geçirebilirsiniz. Daha fazla bilgi için katkıda bulunan kılavuzumuzu inceleyin.
.NET Desktop feedback geri bildirimi
.NET Desktop feedback, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin:
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.