Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 4.0 Silverlight自定义鼠标光标是否不使用画布作为根?_Silverlight 4.0 - Fatal编程技术网

Silverlight 4.0 Silverlight自定义鼠标光标是否不使用画布作为根?

Silverlight 4.0 Silverlight自定义鼠标光标是否不使用画布作为根?,silverlight-4.0,Silverlight 4.0,是否可以使用自定义鼠标指针(png图像),而不使用画布作为根元素?使用Canvas作为根目录时,鼠标可以工作(),但不幸的是,我使用的几个自定义控件在这种设置中无法正常工作:( 谢谢! Palantir您无法摆脱画布的使用,但这并不意味着您必须遵守画布的安排方式 我创造了一些对你有用的行为 第一个是: [TypeConstraint(typeof(Canvas))] public class MouseCursorAction : TargetedTriggerAction<UIEleme

是否可以使用自定义鼠标指针(png图像),而不使用画布作为根元素?使用Canvas作为根目录时,鼠标可以工作(),但不幸的是,我使用的几个自定义控件在这种设置中无法正常工作:(

谢谢!
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汉克斯!