Silverlight 4.0 Silverlight自定义鼠标光标是否不使用画布作为根?
是否可以使用自定义鼠标指针(png图像),而不使用画布作为根元素?使用Canvas作为根目录时,鼠标可以工作(),但不幸的是,我使用的几个自定义控件在这种设置中无法正常工作:( 谢谢!Silverlight 4.0 Silverlight自定义鼠标光标是否不使用画布作为根?,silverlight-4.0,Silverlight 4.0,是否可以使用自定义鼠标指针(png图像),而不使用画布作为根元素?使用Canvas作为根目录时,鼠标可以工作(),但不幸的是,我使用的几个自定义控件在这种设置中无法正常工作:( 谢谢! Palantir您无法摆脱画布的使用,但这并不意味着您必须遵守画布的安排方式 我创造了一些对你有用的行为 第一个是: [TypeConstraint(typeof(Canvas))] public class MouseCursorAction : TargetedTriggerAction<UIEleme
Palantir您无法摆脱画布的使用,但这并不意味着您必须遵守画布的安排方式 我创造了一些对你有用的行为 第一个是:
[TypeConstraint(typeof(Canvas))]
public class MouseCursorAction : TargetedTriggerAction<UIElement>
{
protected override void Invoke(object parameter)
{
}
protected override void OnAttached()
{
var canvas = AssociatedObject as Canvas;
if (canvas == null) { return; }
canvas.MouseMove += new MouseEventHandler(canvas_MouseMove);
canvas.MouseEnter += new MouseEventHandler(canvas_MouseEnter);
canvas.MouseLeave += new MouseEventHandler(canvas_MouseLeave);
}
void canvas_MouseLeave(object sender, MouseEventArgs e)
{
Target.Visibility = Visibility.Collapsed;
}
void canvas_MouseEnter(object sender, MouseEventArgs e)
{
Target.Visibility = Visibility.Visible;
}
void canvas_MouseMove(object sender, MouseEventArgs e)
{
var canvas = sender as Canvas;
var positionInCanvas = e.GetPosition(canvas);
Canvas.SetTop(Target, positionInCanvas.Y);
Canvas.SetLeft(Target, positionInCanvas.X);
}
}
[TypeConstraint(typeof(Canvas))]
公共类鼠标操作:TargetedTriggerAction
{
受保护的覆盖无效调用(对象参数)
{
}
受保护的覆盖无效附加()
{
var canvas=关联对象作为画布;
如果(canvas==null){return;}
canvas.MouseMove+=新的MouseEventHandler(canvas\u MouseMove);
canvas.MouseEnter+=新的MouseEventHandler(canvas_MouseEnter);
canvas.MouseLeave+=新的MouseEventHandler(canvas_MouseLeave);
}
void canvas_MouseLeave(对象发送器,MouseEventArgs e)
{
Target.Visibility=Visibility.Collapsed;
}
void canvas_MouseEnter(对象发送器,MouseEventArgs e)
{
Target.Visibility=可见性.Visibility;
}
void canvas_MouseMove(对象发送器,MouseEventArgs e)
{
var canvas=发送方作为画布;
var POSITIONINCAVAS=e.GetPosition(画布);
Canvas.SetTop(目标,位置incavas.Y);
Canvas.SetLeft(目标,位置incavas.X);
}
}
通过此行为,您可以转换鼠标光标中的任何UIElement。只需将其设置为画布并选择您希望鼠标光标成为的目标
现在,为了解决布局问题,我创建了以下其他行为:
[TypeConstraint(typeof(Canvas))]
public class FillCanvasAction : TargetedTriggerAction<FrameworkElement>
{
protected override void Invoke(object parameter)
{
}
protected override void OnAttached()
{
var canvas = AssociatedObject as Canvas;
if (canvas == null) { return; }
canvas.SizeChanged += new SizeChangedEventHandler(Target_SizeChanged);
}
void Target_SizeChanged(object sender, SizeChangedEventArgs e)
{
var element = Target;
if (element == null) { return; }
var canvas = sender as Canvas;
element.Width = canvas.ActualWidth;
element.Height = canvas.ActualHeight;
Canvas.SetTop(element, 0);
Canvas.SetLeft(element, 0);
}
}
[TypeConstraint(typeof(Canvas))]
公共类FillCanvaAction:TargetedTriggerAction
{
受保护的覆盖无效调用(对象参数)
{
}
受保护的覆盖无效附加()
{
var canvas=关联对象作为画布;
如果(canvas==null){return;}
canvas.SizeChanged+=新的sizechangedventhandler(Target\u SizeChanged);
}
无效目标\u SizeChanged(对象发送方,SizeChangedEventArgs e)
{
var元素=目标;
如果(element==null){return;}
var canvas=发送方作为画布;
element.Width=canvas.ActualWidth;
element.Height=canvas.ActualHeight;
Canvas.SetTop(元素,0);
Canvas.SetLeft(元素,0);
}
}
当附加到父画布时,此行为将根据父画布的大小调整目标FrameworkElement(例如网格)的大小。这意味着您可以在此FrameworkElement内创建自己的自定义布局,而无需担心画布处理排列的方式
然后在XAML中,您可以执行以下操作:
<Grid x:Name="LayoutRoot" Cursor="None">
<Canvas x:Name="canvas" Background="Black">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<local:MouseCursorAction TargetObject="{Binding ElementName=cursorImage}"/>
</i:EventTrigger>
<i:EventTrigger>
<local:FillCanvasAction TargetObject="{Binding ElementName=grid}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<Grid x:Name="grid" Background="White" Width="600" Height="400">
<!-- Create your layout here -->
</Grid>
<Image x:Name="cursorImage" Height="50" Width="50" Source="mouse_cursor.png"/>
</Canvas>
</Grid>
您可以从中获得完整的工作代码
免责声明:严格来说,应该使用弱事件处理来实现此行为,以避免内存泄漏;但是,此实现超出了此答案的范围。您可以找到有关弱事件处理的更多信息,以及您是否需要此网站上的项目。这确实是一个很好的答案!T汉克斯!