2010-09-30 14 views
5

Witam Próbuję pozbyć się irytującego menu kontekstowego "O Silverlight", które pojawia się po kliknięciu prawym przyciskiem myszy w aplikacji Silverlight. Dodałem zwyczajowe sposoby:Wyłącz prawym przyciskiem myszy wyskakujące okienko "Silverlight" w comboboxach

W App.xaml
rootVisual.MouseRightButtonDown + = ((s, args) => args.Handled = true);

i tak samo dla wszystkich okien potomnych. Problem, który się utrzymuje, jest we wszystkich "pop-up" -kontrolach takich jak comboboxes i popup kalendarza datepicker. Tam nie mogę się tego pozbyć. Chciałbym obsłużyć kliknięcie prawym przyciskiem myszy w stylu, który mogę wykonać domyślnie dla całej aplikacji. czy to możliwe? Czy mogę rozwiązać ten inny inteligentny sposób?

Najlepszy
Daniel

Odpowiedz

6

odpowiedź była odziedziczyć combobox i dokonać kontroli niestandardowy takiego:

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; 
    } 

z metodą rozszerzenia dla elementu typu framwork wyglądającego jak to:

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; 
    } 
} 

trzeba obsłużyć datepicker w ten sam sposób, ale zamiast DropDownOpened i DropDownClosed użyć CalenderOpened i CalenderClosed

+1

Nie trzeba tworzyć niestandardowej klasy. Dołączone zachowanie działa dobrze. – SergioL

+0

+1: to fantastyczna poprawka. Dobrze opisane. używanie na SL AutocompleteComboBox z tym samym efektem. –

2

C# Corner ma artykuł do mocowania o popup na Silverlight 3:

Disable Context Menu in Silverlight 3 Application

+1

Dzięki za odpowiedź. To rozwiązanie działa idealnie, jeśli uruchomisz aplikację w przeglądarce. Niestety ta poprawka usuwa możliwości OOB dla aplikacji, a OOB jest warunkiem wstępnym od klienta. –

Powiązane problemy