2017-01-26 2 views
0

현재 ListBox 위에 마우스를 가져 가면 ListBox과 겹치는 Popup이있는 ControlTemplate을 실험하고 있습니다. 이제 ListBox 위로 마우스를 움직이면 디스플레이가 Popup처럼 잘 작동합니다.값이 false 일 때이 트리거가 왜 업데이트됩니까?

그러나, 최대한 빨리이 Popup 위로 마우스를 같이하여 ListBox를 떠나으로 트리거 다시 IsOpen -Property를 업데이트 할 것 같습니다과 Popup을 닫습니다. 내 이해에서 트리거는 IsMouseOver -Property가 true으로 설정되고 따라서 Popup이 열려 있어야합니다 (트리거 할 수있는 요소가 있어야하기 때문에).

논리 오류가 있거나이 경우 트리거가 얼마나 정확하게 작동합니까?

<ControlTemplate x:Key="SelectTargetsListBox"> 
    <Grid> 
     <ListBox x:Name="PART_ListBoxBonusTargets" Height="200" 
       ItemsSource="{Binding Path=Targets}" /> 
     <Popup Name="PART_PopupListBoxBonusTargets" 
       PlacementTarget="{Binding ElementName=PART_ListBoxBonusTargets}" 
       Placement="Right" 
       VerticalOffset="-10" HorizontalOffset="-10" 
       PopupAnimation="Fade" AllowsTransparency="True" StaysOpen="True"> 
      <Border MinHeight="300" MinWidth="400" 
        Background="{StaticResource BonusPopupBackgroundColor}" 
        BorderBrush="{StaticResource BonusForegroundColor}" 
        BorderThickness="3"> 
      </Border> 
     </Popup> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <Trigger SourceName="PART_ListBoxBonusTargets" 
       Property="IsMouseOver" Value="True"> 
      <Setter TargetName="PART_PopupListBoxBonusTargets" 
        Property="IsOpen" Value="True" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

답변

1

내가 얼마나 논리적 오류 또는이 있습니까를 이 사건에서 방아쇠가 작동합니까?

팝업 조건의 IsOpen 속성은 트리거 조건이 참일 때만 true가됩니다. 트리거 조건이 false가되면 IsOpen 속성은 기본값 인 false로 다시 설정됩니다. 왜? WPF에서 트리거가 작동하는 방식이기 때문입니다.

XAML은 마크 업이며 실제로 순수 XAML에서 특정 작업을 구현할 수 있다고하더라도 항상이 작업을 수행해야한다는 의미는 아닙니다.

C#과 같은 프로그래밍 언어는 XAML보다 간결하고 표현력이 뛰어나며 일반적으로 응용 프로그램의 모든 동작을 구현하는 데 사용해야합니다.

이 이벤트는 프로그래밍 방식으로 마우스 이벤트를 처리하고 XAML 트리거를 사용하는 대신 Popup의 IsOpen 속성을 true/false로 명시 적으로 설정하는 것이 훨씬 쉬운 예입니다.

+0

트리거가 이와 같이 작동하는 이유에 대한 개념이 있습니까? Btw. 내가보기 모델에서 그것을 할 것이라고 생각하지만 XAML 트리거를 사용하여 수행 할 수 있는지 궁금합니다. – Adwaenyth

+0

"트리거 조건이 더 이상 충족되지 않으면 트리거에 의해 변경된 속성이 이전 값으로 자동 재설정됩니다."https://msdn.microsoft.com/en-us/library/system.windows.trigger(v=vs. 110) .aspx. 이것이 예상되는 동작입니다. 예를 들어 요소에 IsMouseOver 트리거를 적용한다고 가정합니다. 그런 다음 마우스가 떠날 때이 브러시를 붙이지 않기를 바랄 것입니다. 이것은 매우 이상 할 것입니다. – mm8

1

속성이 변경 될 때마다 트리거가 작동하지 않습니다. 값이 true이면 Trigger에서 설정 한 변경 사항을 트리거하고, 그렇지 않으면 초기 상태로 다시 보내집니다.

올바른 방법은 이벤트 호출에 의해 그것을 할 것, 나도 몰라 최고의 이벤트하지만 만약 당신이 예를 가지고 좋아 :

<ListBox MouseEnter="ListBox_MouseEnter" x:Name="PART_ListBoxBonusTargets" Height="200" 
      ItemsSource="{Binding Path=Targets}" /> 

private void ListBox_MouseEnter(object sender, MouseEventArgs e) { 
     e.Handled = true; 
     PART_PopupListBoxBonusTargets.IsOpen = true; 
    } 
+0

'MouseEnter' 이벤트를 연결하면 할 수 있습니다. 아무 것도 도움이되지 않으면 지금까지도 뷰 모델에서 속성을 만들 수 있습니다. 그러나 조건이 충족되지 않을 때 트리거로 인해 뷰가 변경되는 이유에 대해 궁금합니다. 당신은 "초기 상태로 되돌려 보내라"고 말했다. 왜 그렇게합니까? – Adwaenyth

+0

명확히하기 위해이 문제의 추론은 무엇입니까? 누군가가'거짓 '경우에 방아쇠를 당기는 것을 잊지 않거나, 내가 더 잘 알지 못하는 어떤 더 깊은 배경을 가지고 있습니까? – Adwaenyth

+1

트리거는 링크 된 속성이 "업데이트"될 때마다 트리거됩니다. 그래서 당신이'ListBox'를 떠날 때 IsMouseOver' 속성은 의존성 프로퍼티이기 때문에 거짓으로 업데이트됩니다. 당신의 UI 스레드는 업데이트 할 것이 있는지 확인하고 당신의 경우에 당신이 정의한'Trigger' 체크를 다시 실행합니다 – Safe