2010-06-18 11 views
9

Tytuł prawie wyjaśnia pytanie. Mam kontrolę użytkownika załadowaną do głównego okna, gdy aplikacja jest uruchamiana po raz pierwszy. Co chcę zrobić, to podnieść zdarzenie w oknie nadrzędnym po kliknięciu przycisku na kontroli użytkownika, więc jak mogę podnieść wydarzenie nadrzędne z przycisku 1_Click na formancie użytkownika?Podnoszenie zdarzenia w oknie nadrzędnym za pomocą formantu użytkownika w .NET C#

+0

Jako FYI, Piszę WPF aplikacja komputerowa, więc przykład propagacji zdarzenia kontrolnego użytkownika byłby doskonały. – user246392

Odpowiedz

2

Musisz RoutedEvent link

„trasowane zdarzenia są zdarzeniami, które pływają w górę lub w dół wizualnej drzewa acording do ich RoutingStrategy. Strategia routingu może być bańka, tunel lub bezpośredni. Można podłączyć do obsługi zdarzeń na element, który podnosi zdarzenie lub też inne elementy nad i pod nim, używając dołączonej składni zdarzenia: Button.Click = "Button_Click". "

29

Ten problem wydaje się nie być w pełni opisane end-to-end w dowolnym miejscu: Link dostarczane powyżej nie pełne wyjaśnienie w jaki sposób zdefiniować, podnieść i haczyk zdarzenia z UserControl do okna nadrzędnego . Dla niektórych może być oczywiste, ale zabrało mi chwilę, aby połączyć kropki, więc podzielę się moimi odkryciami. Tak, sposobem na to jest użycie niestandardowego zestawu RoutedEvent do RoutingStrategy.Bubble, ale jest więcej do opowiadania.


W tym przykładzie mam UserControl o nazwie ServerConfigs, który ma przycisk Zapisz. Kiedy użytkownik kliknie przycisk Zapisz, chcę przycisk w oknie nadrzędnym, które zawiera przycisk UserControl, aby włączyć inny przycisk, przycisk nazywa się btn_synchronizuj.

Za pomocą kodu UserControl zdefiniuj poniższe, zgodnie z powyższym linkiem RoutedEvent.

public partial class ServerConfigs : UserControl 
{ 

    // Create RoutedEvent 
    // This creates a static property on the UserControl, SettingsConfirmedEvent, which 
    // will be used by the Window, or any control up the Visual Tree, that wants to 
    // handle the event. This is the Custom Routed Event for more info on the 
    // RegisterRoutedEvent method 
    // https://msdn.microsoft.com/en-us/library/ms597876(v=vs.100).aspx 

    public static readonly RoutedEvent SettingConfirmedEvent = 
     EventManager.RegisterRoutedEvent("SettingConfirmedEvent", RoutingStrategy.Bubble, 
     typeof(RoutedEventHandler), typeof(ServerConfigs)); 

    // Create RoutedEventHandler 
    // This adds the Custom Routed Event to the WPF Event System and allows it to be 
    // accessed as a property from within xaml if you so desire 

    public event RoutedEventHandler SettingConfirmed 
    { 
     add { AddHandler(SettingConfirmedEvent, value); } 
     remove { RemoveHandler(SettingConfirmedEvent, value); } 
    } 
    .... 

    // When the Save button on the User Control is clicked, use RaiseEvent to fire the 
    // Custom Routed Event 

    private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 
    .... 
     // Raise the custom routed event, this fires the event from the UserControl 
     RaiseEvent(new RoutedEventArgs(ServerConfigs.SettingConfirmedEvent)); 
    .... 
    } 
} 

Istnieje przykład wdrożenia, w którym powyższy samouczek kończy się. Jak więc złapać zdarzenie w oknie i poradzić sobie z nim?

W ten sposób z window.xaml można użyć Custom RoutedEventHandler zdefiniowanego w formancie użytkownika. To jest dokładnie tak, jak button.click itp

<Window> 
.... 
<uc1:ServerConfigs SettingConfirmed="Window_UserControl_SettingConfirmedEventHandlerMethod" 
        x:Name="ucServerConfigs" ></uc1:ServerConfigs> 
... 
</Window> 

OR w kodzie za okno, można ustawić eventhandler poprzez AddHandler, zwykle w konstruktorze:

public Window() 
{ 
    InitializeComponent(); 
    // Register the Bubble Event Handler 
    AddHandler(ServerConfigs.SettingConfirmedEvent, 
     new RoutedEventHandler(Window_UserControl_SettingConfirmedEventHandlerMethod)); 
} 

private void Window_UserControl_SettingConfirmedEventHandlerMethod(object sender, 
       RoutedEventArgs e) 
{ 
    btn_synchronize.IsEnabled = true; 
} 
+2

Ten artykuł jest wart czytania. –

+1

Wreszcie można ustawić RoutedEvents na "kliknięcie" - ta odpowiedź obejmuje cały proces od początku do końca. Świetna sprawa. – nocarrier

Powiązane problemy