Ö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:

  1. yöntemini kullanarak RegisterRoutedEvent bir RoutedEvent kaydedin.

  2. 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ı ise Tap tanımlayıcı olarak adlandırılmalıdır TapEvent.
    • Tünel stratejisine sahip yönlendirilmiş bir olayın tanımlayıcısı olarak adlandırılırPreview<event name>Event. Örneğin, olay adı ise Tap tanımlayıcı olarak adlandırılmalıdır PreviewTapEvent.
  3. 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.
  4. 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:

  1. yöntemini kullanarak RegisterRoutedEvent bir RoutedEvent adlandırılmış değeri ConditionalClick kaydeder ve kayıt sırasında kabarcıklama stratejisini belirtir.
  2. RoutedEvent Kayıt çağrısından döndürülen örneği adlı ConditionalClickEventstatik salt okunur alana atar.
  3. CLR olay erişimcilerini ekleme ve kaldırmayı tanımlar.
  4. öğ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ınan OnClick sanal yöntemin içinden yönlendirilmiş olayı tetiklese ConditionalClick 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 :

  1. Yönlendirilen ConditionalClick olay üzerinde CustomButtonoluşturulur.
  2. Handler_ConditionalClick öğesine eklenen CustomButton olay işleyici tetiklendi.
  3. Yönlendirilen ConditionalClick olay, öğe ağacından öğesine StackPanel1doğru ilerler.
  4. Handler_ConditionalClick öğesine eklenen StackPanel1 olay işleyici tetiklendi.
  5. Yönlendirilen ConditionalClick olay, diğer çapraz geçiş öğelerine bağlı diğer ConditionalClick 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:

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.