1

私は Windows Phone 8 アプリに取り組んでおり、選択時に独自のサイズを変更する UserControls を作成しようとしています。Selected/NotSelected 間の変更は、VisualStateManager を使用して行われます。次の例を単純にするために、これをスキップして、UserControl を直接タップするように反応します。

問題は、Storyboard.TargetName プロパティで UserControl 自体を参照する方法がわからないため、Storyboard を使用して UserControl のサイズを変更する方法が見つからないことです。

<UserControl 
    x:Class="Namespace.MyUserControl"
    ...
    Tap="UserControl_Tap">

    <UserControl.Resources>
        <Storyboard x:Key="Expand">
            <DoubleAnimation To="400" Storyboard.TargetName="????" Storyboard.TargetProperty="Width">
                <DoubleAnimation.EasingFunction>
                    <CubicEase EasingMode="EaseInOut"/>
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
        </Storyboard>

        <Storyboard x:Key="Collaps">
            ...
        </Storyboard>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">
        <Rectangle x:Name="TestRect" Fill="Red" Width="10" Height="10"/>
    </Grid>
</UserControl>

private void UserControl_Tap(object sender, System.Windows.Input.GestureEventArgs e) {
    if (Width < 400) {
        Storyboard storyBoard = (Storyboard)this.Resources["Expand"];
        storyBoard.Begin();

        Width = 400;
        Height = 400;
    } else {
        Storyboard storyBoard = (Storyboard)this.Resources["Collaps"];
        storyBoard.Begin();

        Width = 200;
        Height = 200;
    }
}

ストーリーボードはStoryboard.TargetNameを指定する必要があります。????の代わりに何を使用する必要がありますか? UserControl 自体を参照するには? 「this」を使用しても機能せず、「TargetName this を解決できません」という InvalidOperationException がスローされます。「 Namespace.MyUserControl 」を使用する場合も同じことが起こります。

LayoutRoot」を TargetName として使用しても例外はスローされませんが、どちらも機能しません。何も起こりません。

UserControl 内のサブコントロールのアニメーション化 (例: Storyboard.TargetName=TestRect" を使用した TestRect) は問題なく動作します。 また、ストーリーボードなしで幅と高さを直接設定しても問題ありません。

これを解決する方法はありますか?

4

2 に答える 2

1

わかりました、これは単なるアイデアですが、試してみてください。

ターゲット イベントが発生すると、アニメーションがコントロールから変数にキャストされます。これはどういう意味ですか。

private void SomeEventOccured(object sender, RoutedEventArgs e)
 {
   var sb = _customUserControl.Expand;
   sb.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(CustomUserControl.WidthProperty));
   sb.SetValue(Storyboard.TargetNameProperty, _customUserControl.Name);
   sb.Begin();
 }

または、アニメーションを次のように設定できますApplication.Resources

Storyboard sb = (Application.Current as App).Resources["Expand"] as Storyboard;

そして設定TargetNamePropertyし、TargetPropertyProperty;

PS私はCustomUserControlでそれを試しましたが、TargetPropertyは不透明でした。これがMSDNstackoverflowの質問に役立つことを願っています

于 2013-11-04T16:09:43.560 に答える