2010-09-30 122 views
5

嗨 我試圖擺脫惱人的「關於Silverlight」上下文菜單,每當您右鍵單擊Silverlight應用程序時彈出。我已經添加了通常的方法:禁用在組合框中右鍵單擊「Silverlight」彈出框

在App.xaml中
rootVisual.MouseRightButtonDown + =((S,參數)=> args.Handled = TRUE);

和所有ChildWindows都一樣。 持續存在的問題是所有「彈出」 - 控制像組合框和日期選擇器日曆彈出。在那裏我無法擺脫它。我想以一種我可以隱含的方式處理整個應用程序的右鍵單擊。這可能嗎?我能解決一些其他的智能方式嗎?

最佳
丹尼爾

回答

6

答案是繼承組合框,讓這樣一個自定義的控制:

public class CellaComboBox : ComboBox 
{ 
    public CellaComboBox() 
    { 
     DropDownOpened += _dropDownOpened; 
     DropDownClosed += _dropDownClosed; 
    } 

    private static void _dropDownClosed(object sender, EventArgs e) 
    { 
     HandlePopupRightClick(sender, false); 
    } 

    private static void _dropDownOpened(object sender, EventArgs e) 
    { 
     HandlePopupRightClick(sender, true); 
    } 

    private static void HandlePopupRightClick(object sender, bool hook) 
    { 
     ComboBox box = (ComboBox)sender; 
     var popup = box.GetChildElement<Popup>(); 
     if (popup != null) 
     { 
      HookPopupEvent(hook, popup); 
     } 
    } 

    static void HookPopupEvent(bool hook, Popup popup) 
    { 
     if (hook) 
     { 
      popup.MouseRightButtonDown += popup_MouseRightButtonDown; 
      popup.Child.MouseRightButtonDown += popup_MouseRightButtonDown; 
     } 
     else 
     { 
      popup.MouseRightButtonDown -= popup_MouseRightButtonDown; 
      popup.Child.MouseRightButtonDown -= popup_MouseRightButtonDown; 
     } 
    } 


    static void popup_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     e.Handled = true; 
    } 

與framworkelement的擴展方法看起來像這樣的:

public static class FrameworkElementExtensions 
{ 
    public static TType GetChildElement<TType>(this DependencyObject parent) where TType : DependencyObject 
    { 
     TType result = default(TType); 

     if (parent != null) 
     { 
      result = parent as TType; 

      if (result == null) 
      { 
       for (int childIndex = 0; childIndex < VisualTreeHelper.GetChildrenCount(parent); ++childIndex) 
       { 
        var child = VisualTreeHelper.GetChild(parent, childIndex) as FrameworkElement; 
        result = GetChildElement<TType>(child) as TType; 
        if (result != null) return result; 
       } 
      } 
     } 

     return result; 
    } 
} 

你需要處理的DatePicker以同樣的方式,但不是DropDownOpened和DropDownClosed您使用CalenderOpened和CalenderClosed

+1

不需要創建自定義類。附加的行爲工作得很好。 – SergioL 2011-03-02 21:45:16

+0

+1:這是一個奇妙的解決方案。描述得很好。在SL AutocompleteComboBox上使用效果相同。 – 2012-11-15 13:14:44

2

C#角落都有對Silverlight 3的固定約彈出的文章:

Disable Context Menu in Silverlight 3 Application

+1

感謝您的答覆。如果您在瀏覽器中運行應用程序,此解決方案完美工作。不幸的是,這個修復程序消除了應用程序的OOB可能性,而OOB是客戶的先決條件。 – 2010-11-04 13:14:26