2017-02-09 6 views
1

私のWPFアプリケーションでは、可視領域の下部に部分的に目に見えるグリッドがあります。マウスオーバーすると、上にスライドし、グリッド内のすべてが表示されます。マウスがグリッドを離れると、マウスはグリッドを下にスライドします。グリッドには、情報を含み、ユーザーが更新できるコンボボックスとテキストボックスがあります。グリッドがクリックされたときにMouseLeaveアニメーションを変更します。

グリッド内の任意の場所をクリックすると、MouseLeaveアニメーションが消えなくなりました(グリッドはマウスを離してもあなたのままになります)。

私は自分のアニメーションを2つの方法で実装していますが、これまでのやり方では動作しませんでした。

実装1:

`<Grid x:Name="PopupAnimation" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="30"> 
      <Grid.Triggers> 
       <EventTrigger RoutedEvent="MouseEnter"> 
        <BeginStoryboard Name="MouseOn"> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="Height" From="30" To="90" Duration="0:0:.15"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="MouseLeave"> 
        <BeginStoryboard Name="MouseOff"> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="Height" From="90" To="30" Duration="0:0:0.15"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="MouseLeftButtonDown"> 
        <StopStoryboard BeginStoryboardName="MouseOff" /> 
       </EventTrigger> 
      </Grid.Triggers> 

`

実装2:

<Grid> 
     <Grid.Style> 
      <Style TargetType="Grid"> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Trigger.EnterActions> 
          <BeginStoryboard Name="MouseOn"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Height" From="30" To="90" Duration="0:0:.15"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
         <Trigger.ExitActions> 
          <BeginStoryboard Name="MouseOff"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Height" From="90" To="30" Duration="0:0:0.15"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.ExitActions> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Grid.Style> 
    </Grid> 

は、これらのいずれかが右の道を見出していますか?アニメーションを無効にするにはどうすればよいですか?

+0

。あなたができる簡単なことは、グリッドのクリックイベントだけです。親グリッドのIsHitTestVisibleプロパティをブールトグルするだけで、クリックされた場合のマウスイベントは無視され、IsHitTestVisible = "false"はそれらを無効にしますIsMouseOverトリガーとそのアクション。 –

+0

@ChrisW。残念ながら、グリッドにはユーザーが実行可能な部分(コンボボックスなど)があります。私は、ユーザーが情報をすばやく表示(マウスオーバー)して編集することができるようにしたいと考えています(クリックすると、ボタンが消えるまで)。それを今質問に編集します。 – Pants

答えて

1

グリッドの任意の場所をクリックすると、MouseLeaveアニメーションがオフにならないようにするにはどうすればいいですか(グリッドはマウスを離してもあなたのままになります)

、スタイルによって上下動を実行する代わりに、問題のすべてのイベントをサブスクライブし、mouse entermouse leaveのイベントとコードビハインドで絵コンテを実行しないでください。

最後のイベントでは、グリッドクリックイベントのコードで、mouse leaveイベントで読み取られ、ストーリーボードを実行しないブールフラグを設定します。ここで


私はあなたの絵コンテについてのアイデアを与えるために分離コードで/アウトでウィンドウを移動しなければならないコードです:それは示されています一度ユーザー実用的であるグリッドで何もない場合は

if (moveRight) 
{ 
    (Resources["MoveToOpen"] as Storyboard)?.Begin(this, false); 
    (Resources["FlipArrowClose"] as Storyboard)?.Begin(this, false); 
} 
else 
{ 
    if (closeWindow == false) 
    { 
     (Resources["MoveToClose"] as Storyboard)?.Begin(this, false); 
     (Resources["FlipArrowOpen"] as Storyboard)?.Begin(this, false); 
    } 
} 
+0

これは正しい方向に私を指摘し、私はそれを機能させました。私は不思議ですが、これはMVVMのパラダイムにどのように適合していますか? – Pants

+0

@Pants MVVMは、データ層から分離したビーズから分離されたビューを持つ "Three Tiered Design"の素晴らしい名前です。 MVVMのドグマは、すべてがXAMLで行われなければならないと考えるように導いた。それはひどく間違っている。 VM上のビジネスロジックとXAMLのビューロジックまたはコードビハインドを維持する限り、それはMVVMです。 XAMLが解析され、コードビハインド*に変換されてリンクされていることを覚えておいてください。したがって、XAMLでできることはコードビハインドで行うことができます。最終的にコードに統合されたときに、XAMLですべてを取得するためには、ジャンプする必要がありますか? :-)いいえ、それはちょうど私の意見です、私は間違っている可能性があります。興味深い。 – OmegaMan

+0

私は最初のフルスタックアプリケーションに取り組んでおり、WPFについて語るときにMVVMが捨てられるのを見ています。あなたがそれを取ることは、私にとって意味のあることです。 Anywho、あなたの助けに感謝! – Pants

関連する問題