WPF、Caliburn、PDF tron を使用するアプリケーションがあります。画像ページを描画し、それらをブラウジングできます。ブラウジングは、特定のボタンまたは特定の canava 領域を押すことによって、いくつかの方法で行うことができます。描画領域の一部は、アクティブ コンテンツ (Web リンク、画像など) の小さなアイコンです。これらのアイコンは、マウスを検出するとアニメーション化されます。次のページまたは前のページに移動すると、canavas ヒット領域以外はすべて問題ありません。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;
}
}
image から継承された icon クラス自体
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;
}
}
}
}