Canvas вместо изображения реагирует на перенаправленное событие

У меня есть приложение, использующее WPF, Caliburn и PDF tron. Он рисует страницы с изображениями и позволяет просматривать их. Просмотр может быть сделан несколькими способами, определенной кнопкой или нажатием определенной области канавы. Часть нарисованной области - это маленькие иконки для активного контента (веб-ссылки, изображения и т. Д.). Эти значки анимируются, когда они обнаруживают на них мышь. Когда я перехожу на следующую или предыдущую страницу, чем-то еще, кроме области хана, все в порядке. Когда я пробую область canavas, значки перестают работать. Они начинают работать, когда я переключаюсь в другое окно (что затрудняет отладку, поскольку visual studio - это другое окно), или когда я щелкаю в любом месте окна приложения. Я отлаживал это, и кажется, что событие, которое обрабатывает анимацию, никогда не направляется на иконку, а иконка никогда не осознает факт, что мышь находится над ней. Только canavas получает уведомление. Может ли кто-нибудь посоветовать решение или правильную методологию устранения неполадок?

(код следует)

Функция рисования значка:

public LinkIcon DrawInteractivityIcon(ICensoredNameLinkIconable link)
    {
        try
        {
            Debug.WriteLine("Drawing Icon on canvas");
            LinkIcon icon = new LinkIcon(link);
            icon.Width = Defaults.CensoredNameIconSize;
            icon.Height = Defaults.CensoredNameIconSize;
            icon.Effect = new DropShadowEffect
            {
                Color = Colors.Gray,
                BlurRadius = Defaults.CensoredNameIconSize / 3 * GetZoom(),
                Opacity = 0.5,
                ShadowDepth = Defaults.CensoredNameIconSize / 7d * GetZoom()
            };

            icon.SetValue(Panel.ZIndexProperty, 210);

            if (link is ICensoredNameLinkTextInfoable)
            {
                ICensoredNameLinkTextInfoable textinfoLink = link as ICensoredNameLinkTextInfoable;
                StringBuilder sb = new StringBuilder();
                sb.Append(textinfoLink.TextInfo);
                if (link is ICensoredNameExpandable)
                {
                    ICensoredNameExpandable expandableLink = link as ICensoredNameLinkExpandable;
                    foreach (ICensoredNameLinkTextInfoable tiLink in expandableLink.AddedLinks.OfType<ICensoredNameLinkTextInfoable>())
                    {
                        sb.AppendLine();
                        sb.Append(tiLink.TextInfo);
                    }
                }
                icon.ToolTip = sb.ToString();
            }

            AddElementToCanvas(icon, 0);

            UpdateCanvasElement(icon, link.IconPosition, link.Page);

            Debug.WriteLine(string.Format("Is icon hitVisible?: {0}", icon.IsHitTestVisible.ToString()));


            return icon;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

Вызывается отсюда: (рисование значков, связывание делегатов мероприятия)

private LinkIcon DrawInteractivityIcon(ICensoredNameLinkIconable link)
    {
        try
        {
            LinkIcon icon = PDFViewer.DrawInteractivityIcon(link);

            icon.MouseEnter += Icon_MouseEnter;
            icon.MouseLeave += Icon_MouseLeave;
            icon.MouseLeftButtonDown += Icon_MouseLeftButtonDown;
            icon.MouseRightButtonDown += Icon_MouseRightButtonDown;
            Debug.WriteLine("Creating icon, binding delegates"); // TODO Clear before going to production

            icon.MouseMove += Icon_MouseMove;
            icon.MouseLeftButtonUp += Icon_MouseLeftButtonUp;

            icon.LongTouch += Icon_LongTouch;

            icon.TouchDown += Icon_TouchDown;
            icon.TouchMove += Icon_TouchMove;
            icon.TouchUp += Icon_TouchUp;
            icon.TouchEnter += Icon_TouchEnter;
            icon.TouchLeave += Icon_TouchLeave;

            return icon;
        }
        catch (Exception ex)
        {
            LogService.LogMessageToXml("Draw icon exception: " + ex.Message, ex);
            return null;
        }
    }

Сам класс значка, унаследованный от изображения

public class LinkIcon : Image
{ <....probably nothing interesting except inheritance... >}

Делегат, управляющий анимацией:

    private void Icon_MouseMove(object sender, MouseEventArgs e)
    {
        Debug.WriteLine(string.Format("Calling Mouse Move! Move Mouse move! at {0}", DateTime.Now.ToString()) );  //TODO clear beore going to production
        System.Windows.Point currentPosition = e.GetPosition(this.PDFViewer);          
        if (_movingElement != null)
        {
            if (PDFViewer.ReaderMode == ReaderModes.CustomInteractivity)
            {
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    PDFViewer.MoveElementToPoint(_movingElement, currentPosition);
                    e.Handled = true;
                }
            }
        }
    }

0 ответов

Другие вопросы по тегам