Я признаю, что я новичок в Silverlight, но вы должны с чего-то начать.
Вот моя проблема: у меня есть код XAML, который создает Canvas для использования на моей веб-странице.Я динамически (в коде позади) создаю 24 меньших объекта холста (называемых плитками) и могу правильно расположить и переместить эти плитки внутри большего холста.Теперь я хочу оживить движение плиток, а не просто «перепрыгивать» из одного места в другое.Внутри XAML я создал раскадровку и анимацию DoubleAnimation для одной из плиток.Нажатие на конкретную плитку, названную в DoubleAnimation / Storyboard, производит правильную анимацию.Теперь я хочу иметь возможность динамически изменять свойства анимации в XAML с помощью кода в выделенном фрагменте кода.В частности, я хочу изменить значения «От», «Кому», «Storyboard.TargetName» и «Storyboard.TargetProperty».Это позволило бы мне использовать одну анимацию для управления движением всех 24 плиток (по одной за раз).Ниже приведен код XAML, а ниже - код, который я пытался заставить работать правильно.
XAML
<Canvas x:Name="LayoutRoot" Background="BlanchedAlmond" Height="700" Width="1405">
<Image Source="bkcolor.png" Canvas.Left="600" Height="500" Width="500" Stretch="UniformToFill" Canvas.Top="100"></Image>
<Canvas x:Name="myContainer" Canvas.Left = "50" Canvas.Top="100">
<!---->
<Canvas.Resources>
<Storyboard x:Name="MoveTileAnimation">
<DoubleAnimation x:Name="myDoubleAnimation"
From="400" To="300"
Duration="00:00:1"
Storyboard.TargetName="Tile23"
Storyboard.TargetProperty="(Canvas.Top)">
<DoubleAnimation.EasingFunction>
<PowerEase Power="3" EasingMode="EaseInOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</Canvas.Resources>
<!---->
</Canvas>
</Canvas>
Код C # в коде позади
private void MainPage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Canvas c = sender as Canvas;
// New location is specified by nx, ny
int nx = 200;
int ny = 300;
// Old Location
int ox = 200;
int oy = 200;
// "Tile Moves Up" -- Other case removed for clarity
//----------------------------------------------
// Code below is known to work correctly
//----------------------------------------------
// Set the "To" and "From" properties
myDoubleAnimation.From = Convert.ToDouble(oy);
myDoubleAnimation.To = Convert.ToDouble(ny);
//----------------------------------------------
// Code below does not function correctly
//----------------------------------------------
MoveTileAnimation.SetValue(Storyboard.TargetNameProperty, c.Name); // c.Name is the
// name of the tile
// that was clicked
MoveTileAnimation.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(Canvas.TopProperty)); // Need to switch between Top and Left
//----------------------------------------------
MoveTileAnimation.Begin(); // This works if the TargetNameProperty in
// the XAML matches the Tile Name
//----------------------------------------------
// Code below is known to work correctly
//----------------------------------------------
// Move the Tile to its new position
tileCanvas[nCanvasID].SetValue(Canvas.TopProperty, Convert.ToDouble(ny));
tileCanvas[nCanvasID].SetValue(Canvas.LeftProperty, Convert.ToDouble(nx));
}
Я не хочу создавать 96 раскадровок, чтобы можно было перемещать 24 плитки в каждом из 4 направлений.Если я смогу изменить работу «TargetNameProperty», это уменьшит до 4 раскадровок.Если мне удастся заставить работать «TargetPropertyProperty», я перейду к одной раскадровке.
Заранее спасибо, Джон