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