【问题标题】:handle click event outside of button处理按钮外的点击事件
【发布时间】:2013-03-22 20:34:16
【问题描述】:

我正在尝试通过重现 Apple AppStore 中的应用来练习 c#。

在应用程序中,有一个带有文本的矩形:"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 事件?如果没有,请创建一个可以这样做的容器。
  • 我添加了 xaml 文件。据我所知,矩形没有点击事件,这就是我使用 Canvas_MouseLeftButtonDown 事件的原因。
  • 我没有在应用商店发布它,我只是尝试为 windows 重建应用程序,为了我自己的娱乐......

标签: c# wpf mouseevent


【解决方案1】:

CanvasUIElement。这允许使用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”(您是否缺少 using 指令还是程序集参考?)顺便说一句,我尝试将该程序复制为一个简单的 Windows 7 程序(不适用于移动设备)
  • 错误信息很清楚,你需要在你的项目中添加对该程序集的引用...
  • 这可能在 Windows 应用商店应用程序中有效,但我猜在 WPF 中不行。
【解决方案2】:

您真的只需要设置画布的背景,因为它只在具有“渲染内容”的地方获得鼠标输入。背景甚至可以是透明的:

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

【讨论】:

    【解决方案3】:

    用这个代替Canvas_MouseLeftButtonDown_1事件:

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

    使用它,您可以单击画布上的任意位置并触发事件。我希望这会有所帮助..

    【讨论】:

    • 或者只是设置画布的背景。
    • 此解决方案之所以有效,是因为您在 MainWindow 类中覆盖了鼠标事件处理程序,并且窗口默认具有背景。试试设置Background="{x:Null}",就不行了。顺便说一句,如果您要覆盖 OnMouseLeftButtonDown,则无需检查 e.Changed。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多