2010-09-30 17 views
5

Hola Estoy tratando de deshacerme del molesto menú contextual "Acerca de Silverlight" que aparece cada vez que hace clic derecho en una aplicación Silverlight. He añadido las maneras habituales:Deshabilitar clic derecho en la ventana emergente "Silverlight" en los cuadros combinados

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

y lo mismo para todos los ChildWindows. El problema que persiste es en todos los controles "emergentes" como los cuadros combinados y el calendario de fechador. No puedo deshacerme de eso. Me gustaría manejar el clic derecho en un estilo que puedo hacer implícito para toda la aplicación. es posible? ¿Puedo resolverlo de otra manera inteligente?

Mejor
Daniel

Respuesta

6

La respuesta fue la de heredar el cuadro combinado y hacer un control personalizado de esta manera:

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

con el método de extensión para framworkelement que se parece a esto:

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

que necesita para manejar el Selector de fechas de la misma manera pero en lugar de DropDownOpened y DropDownClosed utiliza CalenderOpened y CalenderClosed

+1

No fue necesario crear una clase personalizada. Un comportamiento adjunto funciona bien. – SergioL

+0

+1: esta es una solución fantástica. Bien descrito. utilizando en un SL AutocompleteComboBox con el mismo efecto. –

2

C# esquina tiene un artículo para la fijación del sobre emergente en Silverlight 3:

Disable Context Menu in Silverlight 3 Application

+1

Gracias por la respuesta. Esta solución funciona perfectamente si ejecuta la aplicación en un navegador. Desafortunadamente, esta solución elimina las posibilidades de OOB para la aplicación y OOB es un requisito previo del cliente. –

Cuestiones relacionadas