2011-05-16 8 views
9

Así que dejé caer el control WPF Calendar estándar en MainWindow.xaml en una nueva aplicación WPF en VS2010. Si hago clic en un día en el calendario y luego trato de hacer clic en el botón Cerrar de la aplicación, tengo que hacer clic dos veces en el botón Cerrar antes de que acepte el clic. Está actuando como si el Calendar no hubiera lanzado el mouse para interactuar con el resto de la aplicación.WPF Calendar Control aferrándose al mouse

He cambiado Focusable a falso, sin cambios en el efecto, y he intentado reemplazar el PreviewOnMouseUp y llamando al ReleaseMouseCapture() en vano. He hecho lo mismo con MouseLeave y MouseLeftButtonUp con el mismo resultado. Dado que ninguna de esas cosas funciona, sospecho que estoy ladrando el árbol equivocado. Google no ha encontrado nada notable, aunque tal vez mi GoogleFu no esté a la altura de hoy.

¿Alguna idea?

Respuesta

1

El control de calendario se aloja en una ventana emergente y captura el mouse. Cuando hace clic en otro lugar la primera vez, la captura envía el clic al menú emergente, que, al darse cuenta de que ha hecho clic fuera de sí mismo, se cierra. El clic, por lo tanto, no va al botón.

Puede ver el mismo efecto cuando usa un ComboBox. Déjalo caer, luego haz clic en un botón. No hará clic en el botón.

Desafortunadamente, es poco probable que pueda hacer algo para alterar este comportamiento.

Editar: Las versiones más recientes de .NET hacen posible una solución. Ver la respuesta de Eren.

+0

No veo nada de una ventana emergente en la jerarquía de clases de calendario. Calendario-> Control-> etc ...-> Objeto –

+0

@Ritch Melton: Todavía puede usar controles arbitrarios en su 'Plantilla', un ComboBox tampoco hereda de esas clases, pero también usa una ventana emergente internamente. –

+0

@ H.B. Ahh ok. Eso tiene sentido. –

1

Esta es la base del código que utilizo para solucionar el problema de captura del mouse y la falta de eventos Click desde los controles secundarios. Probablemente se pueda simplificar aún más para hacer que el control del calendario sea más directamente accesible, pero yo personalmente tiendo a agregarlo al UserControl.

class FixedCalendar : UserControl 
{ 
    public FixedCalendar() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPreviewMouseUp(MouseButtonEventArgs e) 
    { 
     base.OnPreviewMouseUp(e); 
     if (Mouse.Captured is System.Windows.Controls.Primitives.CalendarItem) 
     { 
      Mouse.Capture(null); 

      var element = e.OriginalSource as FrameworkElement; 
      if (element != null) 
       element.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
     } 
    } 
} 

<UserControl x:Class="FixedCalendar" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Calendar x:Name="Calendar" /> 
</UserControl> 
+0

No dude en editar para hacer más general: literalmente, he cortado los bits más relevantes de mi código actual y no quería editar demasiado en caso de que lo rompiera. – Zooba

27

Puede cambiar este comportamiento mediante la suscripción a eventos PreviewMouseUp del calendario con un controlador de la siguiente manera:

private void Calendar_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    if (Mouse.Captured is CalendarItem) 
    { 
     Mouse.Capture(null); 
    } 
} 
+7

Esto realmente debería marcarse como la respuesta. La respuesta aceptada te dice por qué sucede, esta te dice cómo evitar que suceda. –

1

Este código debe ayudar a

Calendar.PreviewMouseUp += (o, e) => 
{ 
    if (!e.OriginalSource.Equals(Calendar)) 
    { 
     Mouse.Capture(null); 
    } 
}; 
+0

No solo esto no funciona, sino que también introduce el efecto de que al hacer clic en algunas partes del calendario, se cierra la ventana emergente principal. – Edza

Cuestiones relacionadas