2012-05-17 3 views
1

저는 WPF를 처음 사용하고 있으며, 직사각형의 크기와 위치의 변경 사항에 애니메이션을 적용하려고합니다. INotifyPropertyChanged 속성에 바인딩하여 사각형을 설정했습니다. 이것은 잘 작동하지만 변경 사항은 극단적 일 수 있으며 시각적으로 덜 거슬 리기를 바랍니다. WPF에서 직사각형이있는 DataTrigger 사용시 문제가 발생했습니다.

은 잘 작동 :

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" 
     Stroke="black"> 
<Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Canvas.Left" Value="{Binding Path=Coil.Left, Mode=OneWay}"/> 
     <Setter Property="Canvas.Top" Value="{Binding Path=Coil.Top, Mode=OneWay}"/> 
     <Setter Property="Width" Value="{Binding Path=Coil.Width, Mode=OneWay}"/> 
     <Setter Property="Height" Value="{Binding Path=Coil.Height, Mode=OneWay}"/> 
    </Style> 
</Rectangle.Style> 

Coil.Left 내에서 INotifyPropertyChanged 개체 내에서 RectangleF 구조와 후 뒤에 내 코드에서 설정되는 사각형을 포함하는 내 캔버스의 DataContext 속성입니다 개체가 생성됩니다.

내가이가 잘 EventTrigger를 사용하여 애니메이션을 할 수있었습니다 :

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" 
     Stroke="black"> 
<Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Canvas.Left" Value="{Binding Path=Coil.Left, Mode=OneTime}"/> 
     <Setter Property="Canvas.Top" Value="{Binding Path=Coil.Top, Mode=OneTime}"/> 
     <Setter Property="Width" Value="{Binding Path=Coil.Width, Mode=OneTime}"/> 
     <Setter Property="Height" Value="{Binding Path=Coil.Height, Mode=OneTime}"/> 
    </Style> 
</Rectangle.Style> 
<Rectangle.Triggers> 
    <EventTrigger RoutedEvent="Rectangle.MouseEnter"> 
     <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetProperty="Width" 
             To="{Binding Path=Coil.Width, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="Height" 
             To="{Binding Path=Coil.Height, Mode=OneWay}" 
             Duration="0:0:0.5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" 
             To="{Binding Path=Coil.Left, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" 
             To="{Binding Path=Coil.Top, Mode=OneWay}" 
             Duration="0:0:5"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger.Actions> 
    </EventTrigger> 
</Rectangle.Triggers> 

내가 사각형을 통해 내 마우스를 이동하면 코일의 현재 속성 값에 애니메이션을 통해 변경 . 왼쪽, 위쪽, 너비 및 높이 예상대로.

그러나 내가 원하는 것은 Coil 속성 값을 변경하면 애니메이션이 변경됩니다. 따라서 DataTrigger를 설정하고 변환기를 사용하여 항상 true를 반환하면 변경으로 인해 애니메이션을 통해 변경 내용이 재생됩니다.

비록 내가 관계없이 DataTrigger를 사용할 때 창을 열기 전에 예외가 발생합니다. 왜 이런 일이 발생하는지 전혀 알 수 없습니다. 간단하게하기 위해, 나는 컨버터를 꺼내서 바로 직선 값 사용 :이 나에게 예외 오류를 줄 이유에

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" 
     Stroke="black"> 
<Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Canvas.Left" Value="{Binding Path=Coil.Left, Mode=OneTime}"/> 
     <Setter Property="Canvas.Top" Value="{Binding Path=Coil.Top, Mode=OneTime}"/> 
     <Setter Property="Width" Value="{Binding Path=Coil.Width, Mode=OneTime}"/> 
     <Setter Property="Height" Value="{Binding Path=Coil.Height, Mode=OneTime}"/> 
    </Style> 
</Rectangle.Style> 
<Rectangle.Triggers> 
    <DataTrigger Binding="{Binding Path=Coil.Height}" Value="60"> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetProperty="Width" 
             To="{Binding Path=Coil.Width, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="Height" 
             To="{Binding Path=Coil.Height, Mode=OneWay}" 
             Duration="0:0:0.5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" 
             To="{Binding Path=Coil.Left, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" 
             To="{Binding Path=Coil.Top, Mode=OneWay}" 
             Duration="0:0:5"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
    </DataTrigger> 
</Rectangle.Triggers> 

어떤 생각을? WPF에서 경험하지 못하는 문제 일뿐입니다. 이것은 나의 첫 번째 프로젝트입니다.

미리 감사드립니다. 만 EventTrigger를 사용할 수있는 FrameworkElementRectangle는 A에 대한 --John

+0

예외는 무엇입니까? – evanb

+0

예외 유형은 예외 읽기 System.Windows.Markup.XamlParseException 입니다 : System.Windows.Shapes.Rectangle '초기화' '{의 내부 예외가 에서 예외가 발생했습니다 "모음 회원 유형이어야합니다 트리거 EventTrigger. "} – ajw1970

+0

아마 DataTriggers를 지원하는 DataTemplate을 사용하여 작업을 수행 할 수 있습니다 ... 아직까지는 읽지 못했습니다. – ajw1970

답변

0

. Style, ControlTemplateDataTemplate에는 Trigger/MultiTriggerDataTrigger/MultiDataTrigger도 사용할 수 있습니다.

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" Stroke="Black"> 
    <Rectangle.Style> 
     <Style TargetType="{x:Type Rectangle}"> 
      ... 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Coil.Height}" Value="60"> 
        ... 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Rectangle.Style> 
</Rectangle> 
+0

고마워요.하지만 그 방법으로 예외 오류가 발생했습니다. { '' 'System.Windows.FrameworkElement.Style'속성을 설정하면 예외가 발생했습니다. ' 줄 번호 '120'및 줄 위치 '22'. "} {"스레드간에 사용할 수 있도록이 Storyboard 타임 라인 트리를 고정 할 수 없습니다. "} – ajw1970

+0

이것은 SO에 대한 새로운 질문의 또 다른 문제입니다. – LPL

+0

감사합니다. 재 게시하기 전에 좀 더 테스트 해 보겠습니다. – ajw1970

0

최근에 이것에 대해 읽고 있었다 :

이것은 당신의 DataTriggerRectangle 스타일을 이동하고 작동해야 의미합니다. EventTriggersDataTriggers의 유사성에도 불구하고 은 EventTrigger의 경우 Storyboard 안에 있지만 DataTrigger의 경우는 사용할 수 없습니다.

System.Windows.Markup이 표시됩니다.XamlParseException 오류 당신이 대가로

<Style.Triggers> 
    <DataTrigger Binding="{Binding Path=IsBarVisible, 
    Converter={StaticResource myBooleanToVisibiltyConverter}}" Value="Visible"> 
    <DataTrigger.EnterActions> 
     <BeginStoryboard> 
     <Storyboard> 
      <DoubleAnimation 
      Storyboard.TargetProperty="Value" 
      From="{Binding Path=ProgressedAmout}" 
      To="100" 
      Duration="0:0:50" 
      ></DoubleAnimation> 
     </Storyboard> 
     </BeginStoryboard> 
    </DataTrigger.EnterActions> 
    </DataTrigger> 
</Style.Triggers> 

당신이 사용할 수 있으며 EventTrigger, 등 아래로 Storyboard 조건 내에서 바인딩을 사용하여 시도하거나 FromStoryborad의이 To 바인딩을 제거합니다.

관련 문제