2009-07-22 6 views
0

Ceci est un suivi de ma question here. Il semble que même si le InkPresenter est le plus proche de l'utilisateur, les événements MouseDown/MouseMove/MouseUp sont reçus par l'élément Image. Est-ce que quelqu'un sait pourquoi c'est?Ordre Z et la gestion des événements wpf

Edit: Désolé si je ne faisais pas la question plus claire:

J'attatched gestionnaires d'événements à l'InkPresenter, qui est un frère du Image. J'ai mis le ZIndex du InkPresenter à 2 (d'autres éléments ont 0 comme ZIndex). Je ne sais pas pourquoi les gestionnaires d'événements sont reçus par l'image. J'ai supposé que l'élément qui a le plus haut ZIndex serait le plus proche de l'utilisateur. Ainsi, il serait le premier à recevoir les événements MouseDown/MouseMove/MouseUp générés par l'utilisateur mais dans ce cas le Image les reçoit.

Mon code est le suivant:

CustomImage.cs

[TemplatePart(Name="PART_InkPresenter",Type=typeof(InkPresenter))] 
[TemplatePart(Name="PART_Image",Type=typeof(Image))] 
public class CustomImage : Control 
{ 
    public static DependencyProperty SourceProperty; 

    public string Source 
    { 
     get { return (string)GetValue(SourceProperty); } 
     set { SetValue(SourceProperty,value); } 
    } 

    private InkPresenter _presenter; 
    private Image _image; 


    static CustomImage() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomImage), 
       new FrameworkPropertyMetadata(typeof(CustomImage))); 

     SourceProperty = DependencyProperty.Register("Source", 
       typeof(string), typeof(CustomImage)); 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     _presenter = base.GetTemplateChild("PART_InkPresenter") as InkPresenter; 
     _image = base.GetTemplateChild("PART_Image") as Image; 

     _presenter.MouseDown += new MouseButtonEventHandler(_presenter_MouseDown); 
     _presenter.MouseMove += new MouseEventHandler(_presenter_MouseMove); 
     _presenter.MouseUp += new MouseButtonEventHandler(_presenter_MouseUp); 


    } 

    void _presenter_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     // ... 
    } 

    void _presenter_MouseMove(object sender, MouseEventArgs e) 
    { 
     // ... 
    } 

    void _presenter_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     // ... 
    } 

generic.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CustomImage"> 
    <Style TargetType="{x:Type local:CustomImage}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:CustomImage}"> 
        <ControlTemplate.Resources> 
         <local:StringtoImageSource x:Key="ImageSourceConverter"/> 
        </ControlTemplate.Resources> 
        <Canvas Width="{TemplateBinding Width}" 
          Height="{TemplateBinding Height}">    
         <Image x:Name="PART_Image" 
           Width="{TemplateBinding Width}" 
           Height="{TemplateBinding Height}" Source="{Binding 
           RelativeSource={RelativeSource TemplatedParent}, 
           Path=Source, 
           Converter={StaticResource ImageSourceConverter}}"/> 
         <InkPresenter Canvas.ZIndex="2" 
           x:Name="PART_InkPresenter" 
           Width="{TemplateBinding Width}" 
           Height="{TemplateBinding Height}"/> 
        </Canvas> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

Répondre

1

Parce qu'ils ne sont pas prises en charge par quoi que ce soit d'autre? Si personne ne gère l'événement (définit e.Handled à true), ils continueront à traverser l'arborescence visuelle WPF. C'est ce que les événements routés sont censés faire.

Vous n'avez pas vraiment donné assez d'informations pour savoir si quelque chose devrait les manipuler ou non.

+0

Merci pour la réponse Kent :) J'ai mis à jour la question – Nilu