VisualStateManager
'u anladığımı düşündüğümde, bir şey yanlış olduğunu kanıtlıyor.VisualStateManager ve oluşturulan geçişler
WPF 4 kullanıyorum ve yalnızca fareyle üzerine bir öğeyi büyütmeye çalışıyorum ve fareyle üzerine bırakın. Ben sadece bir VisualStateGroup
her durumu tanımlamak ve sonra belirtmek düşündüm bir VisualTransition
GeneratedDuration
bir ile:
<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>
ben bir catch-all bir GeneratedDuration
ile VisualTransition
, ben VSM ara animasyonlar oluşturmak için bekliyordum beri. Yani, kontrolün üzerinde gezinmek, 1 saniye boyunca 1'den 1,5'e kadar ScaleTransform
özelliklerini canlandırmalıdır. Moving ile aynı.
<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>
Ama neden yapın: Bunun yerine, bir 1 saniye gecikme ve istenilen davranışı olsun o zaman aşağıdaki gibi el geçişler belirtirseniz sonra ScaleTransform
özellikleri anında 1.
geri 1.5 çekin ya var Bunu yapmak zorundayım? Oluşturulan geçişlerin tüm noktasının, geçişin, bildiğiniz, üretileceği olduğunu düşündüm. Burada yanlış anladığım nedir?
GÜNCELLEME: Rick'in Yanıt başına itibariyle Blend çalışır şey üretir. Bu nedenle, geriye doğru çalışarak, onu içeren UIElement
yerine doğrudan ScaleTransform
referansı verdiğimi belirledim. Ben aşağıda benim XAML değiştirdi ve o kadar beklenen işleri:
<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>
saçma (ve bariz bir hata) görünüyor, ama işe yarıyor.
Teşekkür
Bu hata, döküm sözdiziminin aşırı yüklenmesiyle de tetiklenebilir. Örneğin, '(Border.Background). (Brush.Opacity)' başarısız ama 'Background.Opacity' iyi çalışıyor. – Artfunkel