İngilizce dilinde oku

Aracılığıyla paylaş


Özel yönlendirilmiş bir olayı nasıl oluşturursunuz (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ö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:

  1. RegisterRoutedEvent yöntemini kullanarak RoutedEvent kaydı yapın.

  2. 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.
  3. 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.
  4. 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.

  1. RegisterRoutedEvent yöntemini kullanarak ConditionalClick adlı bir RoutedEvent kaydeder ve kayıt sırasında kabarcık oluşturma stratejisini belirtir.
  2. Kayıt çağrısından döndürülen RoutedEvent örneğini, ConditionalClickEventadlı statik, salt okunur bir alana atar.
  3. CLR'yi tanımlar ekler ve olay erişimcilerini kaldırır.
  4. 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#
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();
    }
}

Ö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
<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ı 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.
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.

CustomButton tıklandığında:

  1. yönlendirilen ConditionalClick olay CustomButtonüzerinde oluşturulur.
  2. Handler_ConditionalClick'ya bağlı olan CustomButton olay işleyicisi tetiklendi.
  3. ConditionalClick yönlendirilen olay, öğe ağacında yukarı doğru ilerleyerek StackPanel1'e ulaşır.
  4. Handler_ConditionalClick olay işleyicisi StackPanel1'e bağlı olarak tetiklenir.
  5. 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:

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ı.

Ayrıca bkz.