2011-08-14 9 views
13

Considérese primero versión de código (MainWindow.xaml):Al utilizar ScrollViewer como parte de plantilla para un cierto control, el botón izquierdo se maneja

<ScrollViewer> 
    <local:CustomControl1 Width="1000" Height="1000" Background="Red"/> 
</ScrollViewer> 

donde CustomControl1 deriva de ItemsControl. Dentro de CustomControl1, sobreescribo el evento OnMouseDown. Este código funciona perfectamente, y atrapo el evento de mouse down.

Ahora segunda versión de código (MainWindow.xaml):

<local:CustomControl1 Width="1000" Height="1000" Background="Red"/> 

Dentro Generic.xaml, que el cambio de plantilla de mis elementos de control:

  <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 

        <ScrollViewer 
         VerticalScrollBarVisibility="Visible" 
         HorizontalScrollBarVisibility="Visible" 
         > 
         <ItemsPresenter/> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 

Cuando poniendo ScrollViewer como parte del control plantilla, NO recibo OnMouseDownEvent más (para clic izquierdo). Por algún motivo, ahora el evento del mouse marcado como manejado. Si en lugar de anular OnMouseDown I utilizando la siguiente declaración en el interior elementos controlan constructor, el evento es apresado:

AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(OnMouseDown), true); 

En primer lugar, me gustaría entender por qué la colocación en el interior ScrollViewer plantilla de cambiar el comportamiento de ratón. En segundo lugar, ¿alguien sabe alguna solución? La solución que propuse (mediante la captura de eventos manejados) no es aceptable para mí. En mi aplicación, necesito manejar eventos de mouse solo si ninguno de los elementos controlan que los niños lo manejen.

Gracias de antemano.

Respuesta

21

Si nos fijamos en el valor por defecto para una TemplateListBox por ejemplo (que también se deriva de ItemsControl), verá que la ScrollViewer tiene Focusable="False" conjunto de la plantilla. Esto permite que los eventos del mouse pasen a su control

<ScrollViewer VerticalScrollBarVisibility="Visible" 
       HorizontalScrollBarVisibility="Visible" 
       Focusable="False" > 
    <ItemsPresenter/> 
</ScrollViewer> 
+0

¡Buena captura, muchas gracias! – Illidan

+0

No entiendo. ¿Cómo funciona el manejo de eventos con enfoque = falso afecto? –

Cuestiones relacionadas