2017-02-09 1 views
1

WPF의 경우, 보이는 부분의 하단에 부분적으로 눈에 띄는 눈금이 있습니다. 마우스를 올리면 위로 움직이고 그리드의 모든 내용이 표시됩니다. 마우스가 그리드를 떠나면 다시 아래로 슬라이드됩니다. 정보를 포함하고 사용자가 업데이트 할 수있는 표에 콤보 및 텍스트 상자가 있습니다.Grid를 클릭하면 MouseLeave 애니메이션이 변경됩니다.

그리드의 아무 곳이나 클릭하면 MouseLeave 애니메이션이 더 이상 작동하지 않게됩니다 (마우스를 놓아도 그리드가 유지됩니다).

필자는 원하는대로 동작하도록 애니메이션을 구현하기 위해 두 가지 다른 방법을 구현했지만 지금까지는 아무런 운이 없었습니다.

구현 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

가 표시 된 후에는 사용자가 실행 가능한 것입니다 그리드에서 아무것도합니다. 당신이 할 수있는 빠른 일은 그리드의 click 이벤트에 대한 것입니다. 부모 그리드의 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에서 뷰 로직이나 코드 숨김을 유지하는 한 MVMS가 그 것이다. XAML이 파싱되어 * 코드 숨김 *으로 바뀌 었음을 기억하십시오. 따라서 XAML에서 수행 할 수있는 작업은 코드 숨김으로 수행 할 수 있습니다. 궁극적으로 코드에 통합 될 때 XAML에서 모든 것을 얻기 위해 농구를 뛰어 넘어야합니까? :-) 아닙니다. 그건 제 의견입니다. 나는 틀릴 수도 있습니다. – OmegaMan

+0

흥미 롭습니다. 내 첫 번째 전체 스택 응용 프로그램에서 일하고있어 WPF에 대해 이야기 할 때 MVVM이 계속 표시되는 것을 보았습니다. 네가 그것에 걸리면 나에게 많은 의미가있다. 아무도, 도와 줘서 고마워! – Pants

관련 문제