Hikaye panosunda, süreye çarpan bir SpeedRatio ayarı vardır. Buna bir bağımlılık özelliği olmadığı için bağlanamazsınız.
Bu konudan kurtulmak için, storyboard üzerindeki SetSpeedRatio işlevini kullanabilirsiniz. Bu, sadece hikaye panosu kodda başlatılmışsa çalışır (başka bildiğinizde bir hata alırsınız).
Aşağıdaki kod, bir eğirme dikdörtgeninin animasyon hızını etkilemek için bir nesnedeki olayı nasıl artacağınıza ilişkin tam bir örnektir. Metin kutusunun ve veri bağlarının amacı arka plan nesnesini güncellemektir. Düğme öyle ki metin kutusu odağı kaybeder ve nesneyi günceller.
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<Rectangle Margin="50" Width="50" Height="50" Fill="Red" x:Name="rc">
<Rectangle.RenderTransform>
<RotateTransform x:Name="TransRotate"
CenterX="25" CenterY="25" Angle="0" />
</Rectangle.RenderTransform>
<Rectangle.Resources>
<Storyboard x:Key="spin">
<DoubleAnimation x:Name="da"
Storyboard.TargetName="TransRotate"
Storyboard.TargetProperty="Angle"
By="360"
Duration="0:0:10"
AutoReverse="False"
RepeatBehavior="Forever" />
</Storyboard>
</Rectangle.Resources>
</Rectangle>
<TextBox Text="{Binding Speed}" />
<Button>Update Speed</Button>
</StackPanel>
</Window>
Sonra C# kodu
{
public Window1()
{
InitializeComponent();
//create new object
BackgroundObject bo = new BackgroundObject();
//binding only needed for the text box to change speed value
this.DataContext = bo;
//Hook up event
bo.SpeedChanged += bo_SpeedChanged;
//Needed to prevent an error
Storyboard sb = (Storyboard)rc.FindResource("spin");
sb.Begin();
}
//Change Speed
public void bo_SpeedChanged( object sender, int newSpeed)
{
Storyboard sb = (Storyboard)rc.FindResource("spin");
sb.SetSpeedRatio(newSpeed);
}
}
public delegate void SpeedChangedEventHandler(object sender, int newSpeed);
public class BackgroundObject
{
public BackgroundObject()
{
_speed = 10;
}
public event SpeedChangedEventHandler SpeedChanged;
private int _speed;
public int Speed
{
get { return _speed; }
set { _speed = value; SpeedChanged(this,value); }
}
}
ben size kullanımına adapte eminim.
Bu çok takdir edilecektir. – Bill
Teşekkürler, bunu kullanabileceğim. Bir yöntem çağrısı yapmak zorunda olduğumuz için komik (SetSpeedRatio), yani hız oranı değişimini başka bir animasyonla canlandıramam, tüm Xaml ve hepsi; Ancak bu, efekti elde etmek için her zaman yeni animasyonlar uygulamaktan çok daha doğru görünüyor. Teşekkür ederiz. – Bill
Bu cevap bizim durumumuzda en yararlı oldu ancak işe yaramayacak önemli bir fark var. En azından WinRT'de WPF ile. SetSpeedRatio() yöntemi hiçbir şey yapmadı, bu yüzden onu SpeedRatio'ya değiştirdik ve bu hile yaptı. –