WPF Fundamentals Part 3 - RoutedEvents & AttachedEvents

by Florin 21. September 2009 11:10

Conceptul de RoutedEvents este strans legat de cel de arbore vizual. Diferenta principala intre un eveniment normal si unul routed, este ca acesta din urma se poate propaga prin arborele vizual.

Un scenariu de utilizare foarte simplu ar fi urmatorul: userul face click pe un obiect geometric (path). Evenimentul de MouseLeftButtonDown este un RoutedEvent. El se va declansa initial pe obiectul pe care s-a facut click, dar ulterior se propaga in sus pe arborele vizual pe containerul ce contine obiectul geometric, dupa care pe containerul urmator, pana la radacina arborelul (de obicei fereastra). Avantajul in cazul acesta este unul evident: putem afla ca un click a fost facut pe un anumit container, fara sa ne intereseze care obiect exact a fost selectat. Conceptul insa se poate aplica pentru orice tip de eveniment, nu doar evenimente de mouse. Avem de asemenea posibilitatea sa ne creem propriile RoutedEvents. Evenimentul se va propaga prin arborele vizual chiar daca obiectul pe care s-a declansat (in cazul precedent, forma geometrica) nu are un handler pentru evenimentul respectiv. 

Exista urmatoarele modalitati de rutare a unui eveniment:

  1. Bubbling – evenimentele se propaga de la nodurile frunza catre nodurile radacina ale arborelui. Este modalitatea cea mai uzuala de folosire a RoutedEvents.
  2. Tunneling – propagarea se face dinspre nodul radacina catre nodurile frunza ale arborelui vizual. Un astfel de eveniment ar avea rolul de exemplu cand se redimensioneaza un container pentru a informa copiii acestuia ca trebuie sa sa-si actualizeze layout-ul. 
  3. Direct - este similar cu modul de functionare din WindowsForms.

 Figura urmatoare ilustreaza tunelling si bubbling.

Evenimente atasate

Propagarea evenimentelor prin arbore este un concept natural, pentru ca in foarte multe cazuri, actiuni si modificari care au loc intr-o anumita pozitie in arbore au impact asupra intregii structuri.

Exista insa si cazul in care putem trata evenimente care nu au fost definite in clasa respectiva. Atentie! Sistemul functioneaza momentan doar in WPF, nu si in Silverlight.Sistemul este similar cu cel al proprietatilor atasate. De exemplu, clasa Rectangle nu defineste un eveniment de click, dar putem folosi evenimentul declarat in clasa ButtonBase.

<Window x:Class="WpfApplication1.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window1" Height="300" Width="300">

<Grid>

    <Rectangle Fill="Red" ButtonBase.Click="Rectangle_Click"></Rectangle>

</Grid>

</Window>

 

 

Crearea unui eveniment custom

Modelul este similar crearii unei DepencyProperty. Presupune declararea unui membru static, inregistrarea acestuia in sistemul WPF si impachetarea acestuia.

 

In cazul de fata, declansam evenimentul in momentul in care userul face click pe dereptunghiul cu evenimentul atasat de click.

 

START

public partial class Window1 : Window

{

    public Window1()

    {

        InitializeComponent();

    }

 

    public static readonly RoutedEvent MyRoutedEvent =

        EventManager.RegisterRoutedEvent("MyRoutedEvent",

        RoutingStrategy.Bubble, typeof(RoutedEventHandler),

        typeof(Window1));

 

    public event RoutedEventHandler Tap

    {

        add { AddHandler(MyRoutedEvent, value); }

        remove { RemoveHandler(MyRoutedEvent, value); }

    }

 

    private void Rectangle_Click(object sender, RoutedEventArgs e)

    {

        RoutedEventArgs newEventArgs =

            new RoutedEventArgs(Window1.MyRoutedEvent);

        RaiseEvent(newEventArgs);

    }

}

 

 

 END

Comments

Add comment

Nume

Email

Website

biuquote
Loading



Powered by BlogEngine.NET 1.5.0.7