2013-05-13 61 views
0

我創建了一個SecondaryWindow動態地將WindowStyle設置爲None。因此,我想通過覆蓋OnMouseLeftButtonDown將其內容設置爲DragMove-able在UIElement初始化語句中覆蓋事件

我無法弄清楚如何包含SecondaryWindow初始化語句中覆蓋功能

public class MainWindow 
{ 
    Window SecondaryWindow = new Window 
    { 
     WindowStyle = System.Windows.WindowStyle.None, 
     Content = new myUserControl(), 
     Topmost = true,  

     // My failed attempt 
     base.OnMouseLeftButtonDown += (object sender, MouseButtonEventArgs e) => 
     { 
      base.OnMouseLeftButtonDown(e); 
      base.DragMove(); 
     } 
    }; 
} 

回答

1

你的問題可能更普遍地問,「如何在對象初始化添加一個處理一個事件?」。 「對象初始」是指這樣的語法:

Foo newFow = new Foo 
{ 
    Foo.Property = someValue 
}; 

只是爲了確保你不要誤會什麼,OnMouseLeftButtonDown += smth不會覆蓋事件,但增加了一個事件處理程序的事件。

這就是說:你不能。 C#不支持對象初始化的事件註冊處理方法:

// Not possible 
Foo newFoo = new Foo 
{ 
    Event += someHandler 
}; 

也不對C#讓你設置事件:

// Not possible 
Foo newFoo = new Foo 
{ 
    Event = someDelegate 
}; 

但是,您可以解決此限制,通過包裝您類SecondaryWindow的一個屬性的事件:

public class SecondaryWindow : Window 
{ 
    public MouseButtonEventHandler MouseLeftButtonDownSubscriber 
    { 
     set { MouseLeftButtonDown += value; } 
    } 
} 

不,你可以初始化你的對象是這樣的:

Window SecondaryWindow = new Window 
{ 
    WindowStyle = System.Windows.WindowStyle.None, 
    Content = new myUserControl(), 
    Topmost = true, 
    MouseLeftButtonDownSubscriber = (object sender, MouseButtonEventArgs e) => 
    { 
     base.OnMouseLeftButtonDown(e); 
     base.DragMove(); 
    } 
}; 

我不會推薦它,雖然,因爲它增加了混亂的人不熟悉你的代碼,並有可能是沒有很好的理由,從方便做到這一點,除了你使用的對象初始值設定項。我建議初始化對象並在初始化器中設置屬性,但要訂閱它期望的事件,例如在父窗口的構造函數中。