在按钮外部处理点击事件

4
我正在尝试通过复制Apple AppStore中的一个应用程序来练习c#。
在该应用程序中,有一个带有文本“Touch me”的矩形。当您触摸它时,矩形会重新定位。
当您这样做几次后,文本将更改为“Do not Touch me”。在这种情况下,您必须在矩形外部触摸。
一切都进行得很顺利,直到您需要在矩形外部触摸为止。
以下是我的事件处理程序:
    private void Canvas_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
    {
        if (click == 0)
        {
            if (rectangle1.IsMouseOver || textBlock1.IsMouseOver)
            {
               // reposition and stuff
                if (clicks == 10)
                {
                    // Change the value of the variable click to 1 
                    click = 1;
                    textBlock1.Text = "Do Not Click me";
                    Canvas.SetLeft(textBlock1, 200);
                }
            }
        }
        else
        {
            if (rectangle1.IsMouseOver || textBlock1.IsMouseOver)
            {
                // Game Over
                this.Close();
            } else
            {
                // reposition and stuff

                click = 0;
                textBlock1.Text = "Click me";
                Canvas.SetLeft(textBlock1, 225);
            }
        }
    }

该程序在你点击矩形之外的区域时无法正常工作。

当你点击矩形时,程序会关闭,但是当你点击它之外的区域时,什么也不会发生。是否有任何事件处理程序可以完成我想要的任务?

以下是我的XAML代码:

<Window x:Class="ClickMe.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="510" Width="525" ResizeMode="NoResize">
<Canvas Name="canvas" MouseLeftButtonDown="Canvas_MouseLeftButtonDown_1">
    <Rectangle Fill="#FFF4F4F5" Name="rectangle1" HorizontalAlignment="Left" Height="38" Stroke="Black" VerticalAlignment="Top" Width="509" Canvas.Left="0" Canvas.Top="63"/>
    <Label Name="label1" Content="0" Canvas.Left="57" Canvas.Top="446"/>
    <Label Content="Klicks:" Canvas.Left="10" Canvas.Top="446"/>
    <TextBlock Name="textBlock1" Canvas.Left="225" TextWrapping="Wrap" Text="Click Me" Canvas.Top="74" Margin="10,0,0,0"/>

</Canvas>


这取决于我们需要查看XAML。我们无法知道此矩形包含什么 - 也许您可以为容器触发MouseClick事件?如果不能,请创建一个可以执行此操作的容器。 - tnw
我添加了XAML文件。据我所知,矩形没有点击事件,这就是为什么我使用Canvas_MouseLeftButtonDown事件的原因。 - user2200747
我不打算在应用商店发布它,我只是为了自己的娱乐而尝试重建这个应用程序,让它能在Windows上运行... - user2200747
3个回答

2

Canvas 是一个 UIElement。这允许使用 PointerPressed 事件。

private void Target_PointerMoved(object sender, PointerRoutedEventArgs e)
{
    Windows.UI.Xaml.Input.Pointer ptr = e.Pointer;

    if (ptr.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse)
    {

        Windows.UI.Input.PointerPoint ptrPt = e.GetCurrentPoint(Target);
        if (ptrPt.Properties.IsLeftButtonPressed)
        {
            //do yo thang
        }
    }
}

这似乎是一个好计划,但是当我尝试将其实现到我的代码中时,我遇到了以下错误:无法找到类型或命名空间名称“Windows”(您是否缺少使用指令或程序集引用?)顺便说一下,我尝试将该程序复制为简单的 Windows 7 程序(不是针对移动设备)。 - user2200747
错误信息非常清晰,你需要将该程序集添加到你的项目中作为引用... - Dean Kuga
1
这可能适用于Windows Store应用程序,但我猜在WPF中不行。 - Clemens

1

你只需要设置画布的背景,因为它只会在“渲染内容”的地方接收鼠标输入。背景甚至可以是透明的:

<Canvas Name="canvas" Background="Transparent"
        MouseLeftButtonDown="Canvas_MouseLeftButtonDown_1">
    ...
</Canvas>

1

使用这个事件代替 Canvas_MouseLeftButtonDown_1 事件:

protected override OnMouseDown(MouseButtonEventArgs e)
{
    if(e.Changed == MouseButton.Left)
      {
    // Your logic on mouse down will go here
      }
    base.OnMouseDown(e);
}

使用这个功能,您可以在画布上的任何位置单击并触发事件。希望这能帮到您。


1
或者只需设置画布的背景。 - Clemens
这个解决方案之所以有效,是因为你在MainWindow类中覆盖了鼠标事件处理程序,并且窗口默认具有背景。尝试设置Background = "{x: Null}",它将不再起作用。顺便说一下,如果你重写OnMouseLeftButtonDown,就不需要检查e.Changed了。 - Clemens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接