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;
}
}
}
}