Z порядок и обработка событий wpf - PullRequest
0 голосов
/ 22 июля 2009

Это продолжение моего вопроса здесь . Кажется, что даже если InkPresenter ближе всего к пользователю, события MouseDown / MouseMove / MouseUp принимаются элементом Image. Кто-нибудь знает, почему это так?

Редактировать: Извините, если я не уточнил вопрос:

Я связал обработчики событий с InkPresenter, который является родственным Image. Я установил ZIndex из InkPresenter в 2 (другие элементы имеют 0 как ZIndex). Я не уверен, почему обработчики событий получают изображение. Я предположил, что элемент, который имеет самый высокий ZIndex, будет ближайшим к пользователю. Таким образом, он будет первым, кто получит события MouseDown / MouseMove / MouseUp, сгенерированные пользователем, однако в этом случае Image получит их.

Мой код выглядит следующим образом:

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>

1 Ответ

1 голос
/ 22 июля 2009

Потому что они не обрабатываются ничем другим? Если никто не обрабатывает событие (устанавливает e.Handled в true), они будут продолжать проходить через визуальное дерево WPF. Это то, что должны делать перенаправленные события.

Вы на самом деле не предоставили достаточно информации, чтобы знать, должно ли что-то с ними обращаться или нет.

...