Динамически изменяющиеся свойства раскадровки (созданной в XAML) в коде C # - PullRequest
0 голосов
/ 18 февраля 2012

Я признаю, что я новичок в 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», я перейду к одной раскадровке.

Заранее спасибо, Джон

1 Ответ

0 голосов
/ 18 февраля 2012

Эта ссылка указывает на статью с кодом для многоразовых раскадровок.Это старая статья, но она применима и сегодня - возможно, эти занятия помогут вам.http://www.codeproject.com/Articles/24543/Creating-and-Reusing-Dynamic-Animations-in-Silverl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...