Özel yönlendirilmiş olay oluşturma (WPF .NET)
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önlendirilen olay özellikleri hakkında bilgi için bkz . Yönlendirilen olayları kullanma. Bu makale, özel yönlendirilmiş olay oluşturmanın temellerini kapsar.
Önkoşullar
Makalede, yönlendirilen olaylar hakkında temel bilgiler edindiğiniz ve Yönlendirilen olaylara genel bakış makalesini okuduğunuz varsayılı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önlendirilen olay adımları
Yönlendirilmiş olay oluşturmanın temel adımları şunlardır:
yöntemini kullanarak RegisterRoutedEvent bir RoutedEvent kaydedin.
Kayıt çağrısı, kayıtlı olay adını, yönlendirme stratejisini ve 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ıklama stratejisine sahip yönlendirilmiş bir olayın tanımlayıcısı olarak adlandırılır
<event name>Event
. Örneğin, olay adı iseTap
tanımlayıcı olarak adlandırılmalıdırTapEvent
. - Tünel stratejisine sahip yönlendirilmiş bir olayın tanımlayıcısı olarak adlandırılır
Preview<event name>Event
. Örneğin, olay adı iseTap
tanımlayıcı olarak adlandırılmalıdırPreviewTapEvent
.
- Kabarcıklama stratejisine sahip yönlendirilmiş bir olayın tanımlayıcısı olarak adlandırılır
OLAY erişimcileri eklemek ve kaldırmak için CLR tanımlayın. CLR olay erişimcileri olmadan, yalnızca ve UIElement.RemoveHandler yöntemlerine doğrudan çağrılar UIElement.AddHandler 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.
Yönlendirilen olayınızı tetikleme 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, sınıfını CustomButton
özel denetim kitaplığında uygular. CustomButton
sınıfından türetilirButton:
- yöntemini kullanarak RegisterRoutedEvent bir RoutedEvent adlandırılmış değeri
ConditionalClick
kaydeder ve kayıt sırasında kabarcıklama stratejisini belirtir. RoutedEvent
Kayıt çağrısından döndürülen örneği adlıConditionalClickEvent
statik salt okunur alana atar.- CLR olay erişimcilerini ekleme ve kaldırmayı tanımlar.
- öğesine tıklandığında ve bir dış koşul uygulandığında
CustomButton
özel yönlendirilmiş olayı tetikleyen özel mantık ekler. Örnek kod, geçersiz kılınanOnClick
sanal yöntemin içinden yönlendirilmiş olayı tetikleseConditionalClick
de, olayınızı istediğiniz şekilde tetikleyebilirsiniz.
public class CustomButton : Button
{
// Register a custom routed event using the Bubble routing strategy.
public static readonly RoutedEvent ConditionalClickEvent = EventManager.RegisterRoutedEvent(
name: "ConditionalClick",
routingStrategy: RoutingStrategy.Bubble,
handlerType: typeof(RoutedEventHandler),
ownerType: typeof(CustomButton));
// Provide CLR accessors for assigning an event handler.
public event RoutedEventHandler ConditionalClick
{
add { AddHandler(ConditionalClickEvent, value); }
remove { RemoveHandler(ConditionalClickEvent, value); }
}
void RaiseCustomRoutedEvent()
{
// 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.
protected override void OnClick()
{
// 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, bir örneğini CustomButton
bir öğesine eklemek ve yöntemini ve StackPanel1
öğeleri için olay işleyicisi olarak ConditionalClick
atamak Handler_ConditionalClick
için CustomButton
XAML işaretlemesi kullanan ayrı bir StackPanelWPF uygulaması içerir.
<Window x: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">
<StackPanel Name="StackPanel1" custom:CustomButton.ConditionalClick="Handler_ConditionalClick">
<custom:CustomButton
Name="customButton"
ConditionalClick="Handler_ConditionalClick"
Content="Click to trigger a custom routed event"
Background="LightGray">
</custom:CustomButton>
</StackPanel>
</Window>
Arka planda kodda WPF uygulaması olay işleyicisi yöntemini tanımlar Handler_ConditionalClick
. Olay işleyicisi yöntemleri yalnızca arka planda kodla uygulanabilir.
// The ConditionalClick event handler.
private void Handler_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.
Tıklandığında CustomButton
:
- Yönlendirilen
ConditionalClick
olay üzerindeCustomButton
oluşturulur. Handler_ConditionalClick
öğesine eklenenCustomButton
olay işleyici tetiklendi.- Yönlendirilen
ConditionalClick
olay, öğe ağacından öğesineStackPanel1
doğru ilerler. Handler_ConditionalClick
öğesine eklenenStackPanel1
olay işleyici tetiklendi.- Yönlendirilen
ConditionalClick
olay, diğer çapraz geçiş öğelerine bağlı diğerConditionalClick
olay işleyicilerini tetikleme olasılığı olan öğe ağacını yukarı doğru devam eder.
Olay işleyicisi Handler_ConditionalClick
, olayı tetikleyen olay hakkında aşağıdaki bilgileri elde eder:
- Olay işleyicisinin eklendiği öğe olan gönderen nesnesi. ,
sender
işleyicinin ilk kez ve ikinci kez çalıştırılmasıStackPanel1
olacaktırCustomButton
. - RoutedEventArgs.Source başlangıçta olayı tetikleyen öğe olan nesnesi. Bu örnekte,
Source
her zamanCustomButton
şeklindedir.
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ş bir 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 olarak Tunnelayarlayacaksınız. Tünel olayları hakkında daha fazla bilgi için bkz . WPF giriş olayları.
Ayrıca bkz.
.NET Desktop feedback