2011-01-28 18 views
8

Khi tôi nghĩ rằng tôi hiểu được số VisualStateManager, điều gì đó đã chứng minh tôi sai.VisualStateManager và các hiệu ứng chuyển tiếp được tạo ra

Tôi đang sử dụng WPF 4 và đang cố gắng phóng to một cách đơn giản một mục trên chuột và thu nhỏ lại khi để chuột. Tôi figured Tôi chỉ muốn xác định mỗi tiểu bang trong một VisualStateGroup và sau đó xác định một VisualTransition với một GeneratedDuration:

<Border x:Name="PART_Root" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderTransformOrigin="0.5,0.5"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup Name="CommonStates"> 
      <VisualStateGroup.Transitions> 
       <VisualTransition GeneratedDuration="0:0:1"/> 
      </VisualStateGroup.Transitions> 

      <VisualState Name="Normal"/> 

      <VisualState Name="MouseOver"> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetName="scaleTransform" Storyboard.TargetProperty="ScaleX" To="1.5" Duration="0"/> 
        <DoubleAnimation Storyboard.TargetName="scaleTransform" Storyboard.TargetProperty="ScaleY" To="1.5" Duration="0"/> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

    <Border.RenderTransform> 
     <ScaleTransform x:Name="scaleTransform" ScaleX="1" ScaleY="1"/> 
    </Border.RenderTransform> 

    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
</Border> 

Kể từ khi tôi có một nhận tất cả VisualTransition với một GeneratedDuration, tôi đã mong VSM để tạo ra hình ảnh động trung gian. Tức là, di chuột qua điều khiển sẽ làm sống động các thuộc tính ScaleTransform từ 1 đến 1,5 trong khoảng thời gian 1 giây. Tương tự với mousing off. Thay vào đó, có một sự chậm trễ 1 giây và sau đó là ScaleTransform tính ngay lập tức chụp tới 1.5 hoặc trở lại 1.

Nếu tôi tự xác định quá trình chuyển đổi như sau sau đó tôi nhận được hành vi mong muốn:

<VisualStateGroup.Transitions> 
    <VisualTransition From="Normal" To="MouseOver"> 
     <Storyboard> 
      <DoubleAnimation Storyboard.TargetName="scaleTransform" Storyboard.TargetProperty="ScaleX" To="1.5" Duration="{StaticResource MouseEnterDuration}"/> 
      <DoubleAnimation Storyboard.TargetName="scaleTransform" Storyboard.TargetProperty="ScaleY" To="1.5" Duration="{StaticResource MouseEnterDuration}"/> 
     </Storyboard> 
    </VisualTransition> 

    <VisualTransition From="MouseOver" To="Normal"> 
     <Storyboard> 
      <DoubleAnimation Storyboard.TargetName="scaleTransform" Storyboard.TargetProperty="ScaleX" To="1" Duration="{StaticResource MouseLeaveDuration}"/> 
      <DoubleAnimation Storyboard.TargetName="scaleTransform" Storyboard.TargetProperty="ScaleY" To="1" Duration="{StaticResource MouseLeaveDuration}"/> 
     </Storyboard> 
    </VisualTransition> 
</VisualStateGroup.Transitions> 

Nhưng tại sao Tôi phải làm điều này? Tôi nghĩ rằng toàn bộ các điểm chuyển tiếp được tạo ra là sự chuyển đổi sẽ là, bạn biết đấy, được tạo ra. Tôi đang hiểu nhầm điều gì ở đây?

CẬP NHẬT: Như mỗi câu trả lời của Rick, Blend tạo ra cái gì đó không làm việc. Vì vậy, làm việc ngược trở lại tôi xác định rằng nó thực sự là một thực tế là tôi tham khảo trực tiếp ScaleTransform thay vì thông qua các UIElement có chứa nó. Tôi đã thay đổi XAML của mình thành những thứ sau và nó hoạt động như mong đợi:

<Border x:Name="PART_Root" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderTransformOrigin="0.5,0.5"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup Name="CommonStates"> 
      <VisualStateGroup.Transitions> 
       <VisualTransition From="Normal" To="MouseOver" GeneratedDuration="{StaticResource MouseEnterDuration}"/> 

       <VisualTransition From="MouseOver" To="Normal" GeneratedDuration="{StaticResource MouseLeaveDuration}"/> 
      </VisualStateGroup.Transitions> 

      <VisualState Name="Normal"/> 

      <VisualState Name="MouseOver"> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetName="PART_Root" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="{StaticResource MouseOverScale}" Duration="0"/> 
        <DoubleAnimation Storyboard.TargetName="PART_Root" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="{StaticResource MouseOverScale}" Duration="0"/> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

    <Border.RenderTransform> 
     <ScaleTransform/> 
    </Border.RenderTransform> 

    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
</Border> 

Dường như vô lý (và một lỗi rõ ràng), nhưng nó hoạt động.

Cảm ơn

+0

Lỗi này cũng có thể được kích hoạt bằng cách lạm dụng cú pháp đúc. Ví dụ '(Border.Background). (Brush.Opacity)' không nhưng 'Background.Opacity' hoạt động tốt. – Artfunkel

Trả lời

6

Tôi không thể nói rằng tôi hoàn toàn hiểu tại sao nó không làm việc theo cách chúng ta mong muốn nó, nhưng trong những tình huống này chúng ta có thể sử dụng Expression Blend để thực hiện các nhiệm vụ và xem những gì đánh dấu nó tạo ra. Tôi đã làm điều đó và đây là một ví dụ làm việc dựa trên mẫu của bạn:

<Grid> 
    <Grid.Resources> 
     <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Border x:Name="PART_Root" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderTransformOrigin="0.5,0.5"> 
          <Border.RenderTransform> 
           <TransformGroup> 
            <ScaleTransform/> 
            <SkewTransform/> 
            <RotateTransform/> 
            <TranslateTransform/> 
           </TransformGroup> 
          </Border.RenderTransform> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup Name="CommonStates"> 
            <VisualStateGroup.Transitions> 
             <VisualTransition GeneratedDuration="0:0:1"/> 
            </VisualStateGroup.Transitions> 
            <VisualState Name="Normal"/> 
            <VisualState x:Name="MouseOver"> 
             <Storyboard> 
              <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="PART_Root"> 
               <EasingDoubleKeyFrame KeyTime="0" Value="2"/> 
              </DoubleAnimationUsingKeyFrames> 
              <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="PART_Root"> 
               <EasingDoubleKeyFrame KeyTime="0" Value="2"/> 
              </DoubleAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Grid.Resources> 
    <Button Content="Button" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Style="{StaticResource ButtonStyle1}"/> 
</Grid> 

Mặc dù Blend sử dụng một tổng quát hơn chuyển đổi nhóm, sự khác biệt chính chúng ta có thể thấy là các chỉ tiêu storyboard một phần tử và một con đường tài sản thông qua đó yếu tố cho các yếu tố tỷ lệ.

+1

Cảm ơn Rick. Tôi đã cập nhật câu hỏi của mình để bao gồm giải pháp cuối cùng. – cantloginfromwork