2011-07-31 8 views
3

私はWP7アプリケーションでグリッド(とその上のすべてのコントロール)を動かそうとしています。グリッドをオフセットする最善の方法はMarginプロパティを使用しているようですが、WP7ではThicknessAnimationUsingKeyFramesがサポートされていないため、直接行うことはできません。xamlストーリーボードをWP7のカスタムコントロールのポイントプロパティにバインドするにはどうすればよいですか?

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プロパティが呼び出されることは決してありません。

エディタでは、OriginOffsetを変更するたびにマージンも変更されます(マージン=新しい厚さ(value.X、value.Y)にブレークポイントを設定します)。予想通り。

感謝任意の助け! おかげ

+0

データバインディングをサポートするために、DependencyPropertyにする必要がOriginOffsetはありません? –

+0

華麗!ありがとう。私は例外を過ぎているが、何も起こらない...上記のコードスニペットを更新した。何かご意見は? – swinefeaster

答えて

1

依存関係のプロパティが明確に定義されていません。あなたは、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))); 
+0

buyaka!あなたは素晴らしいです – swinefeaster

2

あなたはストーリーボードを開始するEventTriggerか何かを使用しているつもりはないされていますか?そして、私は考えていない。アウトthisをチェックすることをお勧めします括弧が必要です。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> 
+0

上記のように、Begin()コールをコード内で手動で開始することはできませんか?私のブレークポイントはヒットしていませんか?アニメーションがOriginOffsetの値を変更しようとしていないようです。 – swinefeaster

+0

ええ、Beginは動作します。あなたのユーザーコントロールのコンストラクタでInitializeComponentを呼び出す必要がありますか? –

+0

TargetProperty = "OriginOffset"にします –

関連する問題