簡而言之:我想聲明一個自定義路由事件,同時從聲明它的相同用戶控件中聽它。WPF - 聲明一個自定義路由事件並收聽它
我想實現的是有一個服務於特定任務要求的用戶控件,所以我想象這樣的情景:
- 用戶控件類聲明的自定義路由事件
- 用戶控制類聽經的AddHandler自己的定製路由事件(...)
然後:
- 視覺樹中的一些隨機項使用RaiseEvent(...)來......好,提高事件。
- 樹中用戶控件的一個實例服務於請求。
它似乎沒有工作。我知道,這與用戶控件聲明和提升事件的通常場景有點不同,所以我做了一些測試。
如何創建自定義路由事件似乎很清楚,這不是我第一次這樣做。我創建了一個示例用戶控件,並且它的代碼如下:
public partial class FuffaControl : UserControl
{
public static readonly RoutedEvent FuffaEvent = EventManager.RegisterRoutedEvent("Fuffa", RoutingStrategy.Bubble, typeof(FuffaEventHandler), typeof(FuffaControl));
// Provide CLR accessors for the event
public event FuffaEventHandler Fuffa
{
add { AddHandler(FuffaEvent, value); }
remove { RemoveHandler(FuffaEvent, value); }
}
public FuffaControl()
{
InitializeComponent();
}
}
到目前爲止,太棒了。然後,爲了測試目的,我已經聲明瞭一個窗口,裏面有自定義控件和一個按鈕。這是該窗口的內容:
<Grid>
<local:FuffaControl>
<Grid>
<Button Content="Fuffa" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click"/>
</Grid>
</local:FuffaControl>
</Grid>
在後面的代碼,我使用的AddHandler聽的事件,我引發事件的按鈕的點擊:
public MainWindow()
{
InitializeComponent();
this.AddHandler(FuffaControl.FuffaEvent, new FuffaEventHandler(OnFuffaEvent));
}
private void Button_Click(object sender, RoutedEventArgs e)
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(FuffaControl.FuffaEvent);
RaiseEvent(newEventArgs);
}
private void OnFuffaEvent(object sender, RoutedEventArgs e)
{
}
它的工作原理。它沒有什麼意義(我的意思是沒有用),但我只是用它來測試事件本身是否正常工作。好吧,除非C#正在做一些奇怪的事情並切割幾個角落,但乍看之下,在我看來,按鈕正在引發一個自定義事件,事件在樹中傳播(畢竟這是一個冒泡事件),並且窗口收到它。
因此,接下來我將AddHandler(...)調用和處理函數移動到用戶控件中;現在不是聽Raisevent(...)的窗口,而是用戶自己控制。如果一切正常,我有孩子元素引發一個事件,並且父的用戶控制管理它:
public partial class FuffaControl : UserControl
{
public static readonly RoutedEvent FuffaEvent = EventManager.RegisterRoutedEvent("Fuffa", RoutingStrategy.Bubble, typeof(FuffaEventHandler), typeof(FuffaControl));
// Provide CLR accessors for the event
public event FuffaEventHandler Fuffa
{
add { AddHandler(FuffaEvent, value); }
remove { RemoveHandler(FuffaEvent, value); }
}
public FuffaControl()
{
InitializeComponent();
this.AddHandler(FuffaControl.FuffaEvent, new FuffaEventHandler(OnFuffaEvent));
}
private void OnFuffaEvent(object sender, RoutedEventArgs e)
{
}
}
Nnnnnope。它不起作用。爲什麼?這有什麼問題?爲什麼用戶控制不能聽自己的事件?
有人殺了我,請。 – motoDrizzt
從這個評論是不清楚,如果我的回答是否有幫助:) – Evk
是的,幫助:現在我相信是時候掛斷鍵盤和改變工作。 – motoDrizzt