Как связать раскадровку xaml со свойством Point пользовательского элемента управления в WP7? - PullRequest
3 голосов
/ 01 августа 2011

Я пытаюсь заставить Grid (и все элементы управления на нем) дрожать в моем приложении WP7.Кажется, лучший способ смещения сетки - использование свойства Margin, но в WP7 не поддерживается ThicknessAnimationUsingKeyFrames, поэтому я не могу сделать это напрямую.

Вместо этого я создал пользовательский элемент управления:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;

namespace MyNamespace
{
  // Grid which has an OriginOffset property that is tied to the margin,
  // and thus can be animated.

  public class OffsettableGrid : Grid
  {
    public OffsettableGrid()
    {
    }

    public static readonly DependencyProperty OriginOffsetProperty = 
        DependencyProperty.Register(
        "OriginOffset", typeof(Point), typeof(OffsettableGrid), null);

    public Point OriginOffset
    {
      get
      {
        return new Point(Margin.Left, Margin.Top);
      }
      set
      {
        Margin = new Thickness(value.X, value.Y,
          Margin.Right, Margin.Bottom);
      }
    }
  }
}

, а затем в xaml я объявляю раскадровку следующим образом:

<Storyboard x:Name="m_shakeStoryboard" 
            RepeatBehavior="5x" 
            AutoReverse="False" 
            SpeedRatio="5">

    <PointAnimationUsingKeyFrames 
        BeginTime="00:00:00"
        Storyboard.TargetName="m_chooseAnswerGrid"
        Storyboard.TargetProperty="(OffsettableGrid.OriginOffset)">

        <EasingPointKeyFrame KeyTime="00:00:00"    Value="0,0"/>
        <EasingPointKeyFrame KeyTime="00:00:00.2"  Value="-10,0"/>
        <EasingPointKeyFrame KeyTime="00:00:00.4"  Value="10,0"/>
        <EasingPointKeyFrame KeyTime="00:00:00.6"  Value="0,0"/>
    </PointAnimationUsingKeyFrames>

</Storyboard>

и затем, конечно, я объявляю свою сетку, используя.

Но когда я иду, чтобы запустить раскадровку:

m_shakeStoryboard.Begin();

мое свойство OriginOffset никогда не вызывается.Я устанавливаю точку останова на «Margin = new Thickness (value.X, ​​value.Y»), но она никогда не попадает в цель. Что я делаю не так?

В редакторе всякий раз, когда я изменяю OriginOffset, изменяются полякак и ожидалось.

Любая помощь высоко ценится! Спасибо

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Возможно, вы захотите проверить это .Разве вы не собираетесь использовать EventTrigger или что-то еще, чтобы запустить StoryBoard?И я не думаю, что вам нужны скобки, Storyboard.TargetProperty="(OffsettableGrid.OriginOffset)"

          <EventTrigger RoutedEvent="Button.Click">    
            <BeginStoryboard>
              <Storyboard>
                <ColorAnimation 
                  Storyboard.TargetName="myAnimatedBrush"
                  Storyboard.TargetProperty="Color"
                  From="Red" To="Blue" Duration="0:0:7" />
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger>
1 голос
/ 13 августа 2011

Ваше свойство зависимости не определено.Вы должны использовать SetValue и GetValue:

public Point OriginOffset
{
   get
   {
       return (Point)GetValue(OriginOffsetProperty);
   }
   set
   {
       SetValue(OriginOffsetProperty, value);
   }
}

Затем добавьте обратный вызов в PropertyMetadata свойства зависимостей, чтобы установить поле:

public static readonly DependencyProperty OriginOffsetProperty = 
    DependencyProperty.Register(
        "OriginOffset", 
        typeof(Point), 
        typeof(OffsettableGrid), 
        new PropertyMetadata(new PropertyChangedCallback(OnOriginOffsetChanged)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...