2013-03-22 36 views
4

我試圖通過重現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> 

+0

取決於,我們需要看到xaml。我們無法知道包含此矩形的東西 - 也許您可以爲任何容器觸發MouseClick事件?如果沒有,創建一個可以這樣做的容器。 – tnw 2013-03-22 20:36:39

+0

我添加了xaml文件。 據我所知,該矩形沒有點擊事件,這就是我使用Canvas_MouseLeftButtonDown事件的原因。 – user2200747 2013-03-22 20:45:17

+0

我不會在應用商店發佈它,我只是嘗試重建窗口的應用程序,爲我自己的娛樂... – user2200747 2013-03-22 20:59:56

回答

1

你真的只需要設置畫布的背景,因爲它只獲得鼠標輸入,它具有「渲染內容」。背景甚至可以是透明的:

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

現在完美,非常感謝你:) – user2200747 2013-03-22 22:28:13

2

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 
     } 
    } 
} 
+0

這似乎是一個很好的計劃,但是當我嘗試實現這個我的代碼我得到以下錯誤:無法找到類型或命名空間名稱'Windows'(您是否缺少使用指令或程序集引用?) 順便說一句,我嘗試重現該程序作爲一個簡單的Windows 7程序(不適用於移動設備) – user2200747 2013-03-22 21:20:51

+0

錯誤消息非常明顯,您需要將該程序集的引用添加到您的項目中... – 2013-03-22 21:30:13

+1

這可能適用於Windows應用商店應用,但我猜不在WPF中。 – Clemens 2013-03-22 22:47:06

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 2013-03-22 21:56:46

+0

此解決方案僅適用於您在MainWindow類中重寫鼠標事件處理程序,並且該窗口默認情況下具有背景。嘗試設置'Background =「{x:Null}」',它將不再起作用。順便說一句,如果你要重寫OnMouseLeftButtonDown,那麼就不需要檢查e.Changed。 – Clemens 2013-03-22 22:29:37