2011-06-24 6 views
0

私はSilverlightでウィンドウのプログラムを書いています。つまり、ポップアップの上部バーにはドラッグ可能な領域があり、そのドラッグ可能な領域にはウィンドウを閉じる "X"があります。私のドラッグ機能には、発生したイベントのバブリングと組み合わせてclose関数が呼び出されないようにするcapturemouse()イベントがあります。ここでは、コードです:SilverlightでのCaptureMouse()のイベントバブリング

private void close_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e){ 
      pop.IsOpen = false; 
      hasFocus = true; 
     } 

     private void topBar_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      Border item = sender as Border; 
      mouseY = e.GetPosition(null).Y; 
      mouseX = e.GetPosition(null).X; 
      draggable = true; 
      item.CaptureMouse(); 

     } 

     private void topBar_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      if(draggable){ 
       double changeY = e.GetPosition(null).Y - mouseY; 
       double changeX = e.GetPosition(null).X - mouseX; 
       double top = changeY + (double)pop.GetValue(Canvas.TopProperty); 
       double left = changeX + (double)pop.GetValue(Canvas.LeftProperty); 
       if(top<0){ 
        top = 0; 
       } 
       if(left<0){ 
        left = 0; 
       } 
       if(left>670){ 
        left = 670; 
       } 
       if(top>450){ 
        top = 450; 
       } 
       pop.SetValue(Canvas.TopProperty, top); 
       pop.SetValue(Canvas.LeftProperty, left); 
       mouseY = e.GetPosition(null).Y; 
       mouseX = e.GetPosition(null).X; 
      } 
     } 

     private void topBar_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      Border item = sender as Border; 
      draggable = false; 
      mouseY = -1; 
      mouseX = -1; 
      item.ReleaseMouseCapture(); 
     } 

編集:ここでは全体のポップアップためのXAMLです:

<Popup x:Name="pop" Height="200" Width="200" VerticalAlignment="Center" HorizontalAlignment="Center"> 
        <Border CornerRadius="5" Width="200" Height="200" Background="#FFFAFCFF" BorderThickness="1"> 
         <Border.BorderBrush> 
          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
           <GradientStop Color="#99666666" Offset="0" /> 
           <GradientStop Color="#99F5F5F5" Offset="0.5"/> 
           <GradientStop Color="#99666666" Offset="1"/> 
          </LinearGradientBrush> 
         </Border.BorderBrush> 
         <StackPanel> 
          <Border x:Name="topBar" CornerRadius="4,4,0,0" BorderBrush="Silver" BorderThickness="0,0,0,1" Background="Crimson" Width="198" Height="20" MouseLeftButtonDown="topBar_MouseLeftButtonDown" MouseMove="topBar_MouseMove" MouseLeftButtonUp="topBar_MouseLeftButtonUp"> 
           <Image x:Name="close" Source="X.png" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,7,0" Height="11" Width="11" MouseLeftButtonUp="close_MouseLeftButtonUp" /> 
          </Border> 
          <StackPanel Margin="10"> 
           <TextBlock Text="Printer info goes here..." /> 
          </StackPanel> 
         </StackPanel> 
        </Border> 
       </Popup> 
+0

私は 'X'がボタンだと仮定しているので、ボタンをクリックすると、ボーダーはまだイベントの送信者ですか?ボタンの上で 'IsHitTestVisible'をfalseに設定していますか? – Danexxtone

+0

私のコードのどこにでも 'IsHitTestVisible'が宣言されていません – Vap0r

+0

xamlのボーダーと 'X'ボタンを表示できますか? – Danexxtone

答えて

1

問題は、あなたのMouseCaptureの呼び出しが原因で発生します。マウスキャプチャを設定すると、マウスイベントを開始できる唯一のコントロールが境界線になります。これは、マウスボタンが押し下げられている間に画像がマウスイベントを引き起こさないことを意味します。 mousecaptureがなければ正常に動作するはずです。私の好奇心のために、なぜあなたはそれを設定し、放しますか?

こちらがお役に立てば幸いです。

編集:

あなたがたMouseEventの位置を取得し、それが画像に収まるかどうかを確認することができます

 var x = e.GetPosition(close).X; 
     var y = e.GetPosition(close).Y; 
     if (0 <= x && x <= 11 && 0 <= y && y <= 11) 
     { 
      //do the close call 
     } 

私はこのコードをテストしていませんが、それはあなたが望むものに近いものでなければなりませんする。

+0

はい、それは問題なく動作しますが、私が設定していないときバグを発見する方法はありますか? – Vap0r

+0

ボーダーとイメージは常に同じ位置にあり、同じサイズですので、マウス座標がイメージ内にあるかどうかを確認して閉じることができますそれに基づいた関数 – Danexxtone

+0

私はgetPositionを正しく呼び出すでしょうか? – Vap0r

関連する問題