2017-02-26 6 views
0

私にはわからないWPFアプリケーションでは少し問題があります。私のインターフェイスは、5つのオーバーラップする透明な画像で構成されています全ての画像は同じサイズであり、インタフェースの異なる要素が各画像を通して見える。私の問題は、一番上のイメージ(グリッドで最後に定義された最後のイメージ)とやりとりできることだけです。 MouseLeftButtonUp、MouseRightButtonUp、MouseEnter、およびMouseLeaveイベントハンドラを最上位のイメージにリンクしましたが、何らかの理由でアプリケーションを実行して他のイメージ(最前面のイメージの透明部分を介して)と対話すると、と述べた。 これはなぜですか、どのように修正できますか?WPF - 単一の希望の画像ではなく、マウスベースのイベントをトリガーするすべての画像

編集:

MouseProblem project file

編集:私は(スタックオーバーフローが、私は2つの以上のリンクを投稿することはできないだろう)、以下の対応する画像を添付しました:ここでは簡略化されたプロジェクトファイルへのリンクがあります

注:イベントをトリガーする唯一の時間は、マウスが最小、最も中央の円(Inner_Button)を入力、クリックまたは離れるときです。

次のように私のグリッドが設定されている

The 5 interface elements

<Grid> 
    <Image 
     x:Name="Frame" 
     Margin="5" 
     Source="Interface/Frame.png" 
     Height="250" 
     Width="250" 
     VerticalAlignment="Center" 
     HorizontalAlignment="Center" 
     /> 

    <Image 
     x:Name="Outer_Indicator" 
     Margin="5" 
     Source="Interface/Outer_Idle.png" 
     Height="250" 
     Width="250" 
     VerticalAlignment="Center" 
     HorizontalAlignment="Center" 
     /> 

    <Image 
     x:Name="Mouse_Indicator" 
     Margin="5" 
     Source="Interface/Mouse_Out.png" 
     Height="250" 
     Width="250" 
     VerticalAlignment="Center" 
     HorizontalAlignment="Center" 
     /> 

    <Image 
     x:Name="_Inner_Indicator" 
     Margin="5" 
     Source="Interface/Inner_Idle.png" 
     Height="250" 
     Width="250" 
     VerticalAlignment="Center" 
     HorizontalAlignment="Center" 
     RenderTransformOrigin="0.5,0.5" 
     > 
     <Image.RenderTransform> 
      <RotateTransform 
       x:Name="Interface_Rotation" 
       Angle="0" 
       /> 
     </Image.RenderTransform> 
    </Image> 

    <Image 
     x:Name="Inner_Button" 
     Margin="5" 
     Source="Interface/Inner_Button.png" 
     Height="250" 
     Width="250" 
     VerticalAlignment="Center" 
     HorizontalAlignment="Center" 
     Cursor="Hand" 
     MouseLeftButtonUp="leftClick" 
     MouseRightButtonUp="rightClick" 
     MouseEnter="mouseEnter" 
     MouseLeave="mouseLeave" 
     /> 
</Grid> 
+0

...あなたは図形を使用して画像を使用して切り替えることもできますが、あなたのイメージの複雑さに応じて、それは疲れる運動であることを証明するかもしれませんが、あなたは完璧なソリューション後にしている場合は、おそらく共有できます問題の画像?または少なくとも最上位のもの?私が作成したサンプル画像で問題を再現できませんでした。 – Grx70

+0

ここでは、5つの要素を1つの画像に結合しなければなりませんでした。左端が最も下の画像で、右端が他のものと並んでいますその間に –

答えて

0

私が正しくあなたの問題を理解していれば、それはあなたが上の任意のイベントをサブスクライブしていないイベントはすべての画像のためにトリガされているマウス(ではありませんトップ以外の画像) - 私はそのような振る舞いを再現することができませんでした。あなたが提供した画像から判断すると、あなたの問題は、マウスがトップ画像のどの部分にあってもトリガされるということですが、マウスが画像。

残念ながら、この機能はWPFで利用できません。今あなたが取ることができる2つの主なアプローチがあります。

マウスが画像の非透明画素を超えているだけにして、あなたのロジックを実行するかどうかを各マウスイベントハンドラで、私は

チェック(参考のためにthis questionを参照してください)アプローチ。しかし、画像が元のサイズで表示されていない場合、これは難しいかもしれません。

アプローチII

Imageの部分がヒットテストのための対象となるフレームワークを伝えるために、適切な幾何学付属Image.Clipプロパティを使用。

個人的には、Imageコントロールのサイズが一定であり(クリップのジオメトリがコントロールのサイズに自動的に拡大されないため)、画像コンテンツは基本的に円です。供給ジオメトリが完全にあなたのイメージと一致しないことにかかわら

<Image x:Name="Inner_Button" (...)> 
    <Image.Clip> 
     <EllipseGeometry Center="125,125" RadiusX="53" RadiusY="53" /> 
    </Image.Clip> 
</Image> 

注:ここでは、私はあなたが後にしている結果を得るべきだと思うものです。少なくともマウスの出来事を引き起こした透明ピクセルはほとんどありませんでしたが、それはほとんど目につきませんでした。

+0

私はもともと同じことを考えましたが、イメージの透明部分はイベントを引き起こさず、非透明部分のみをトリガーします。中央の青い円と周囲のリング。マウスの検出は、必要な動作をしています。唯一の問題は、下の画像も検出されていることです。カーソルを外側のリングを移動することなく中央のサークル(唯一の機能ボタン)にすることはできません。 MouseEnterイベントとMouseLeaveイベントをトリガーしています。それが意味をなさないならば。 –

+0

私は違った結果を出すようだから私はそれが独特だと思っています。使用しているフレームワークのバージョンを指定できますか?また、2つの質問があります。 1.あなたがそれらに登録していないのでマウスイベントをトリガーする他の画像の害は何でしょうか(おそらく、これらのイベントはウィンドウ、ユーザーコントロールなどによって無視されます)。 2.マウスイベントをトリガーしたくない画像に 'IsHitTestVisible =" False "を設定しようとしましたか? – Grx70

+0

私は4.5.2のフレームワークを使用していると信じていますが、もっと新しいかもしれませんが、現時点では私のコンピュータの近くにはありませんので、確認できません。それは害はありませんが、インターフェイスの視覚的な側面(つまり、インターフェイスの特定の部分の色)がMouseEnterおよびMouseLeaveで変更され、中央ボタンの途中のいくつかのリングがインタフェースがややちらつき、むしろ迷惑です。それが私に迷惑をかけていないなら、私はその質問をしなかったでしょう。私はIsHitTestVisibleをそれぞれの画像に対してfalseに変更してみました。 –

関連する問題