0

私は魅力のように機能する次のアニメーションを持っています:

<Window.Resources>
    <Namespace:MathConverter Core:Key="MathConverter"/>
    <Storyboard Core:Key="MyKey" Completed="OnCompleted">
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" BeginTime="00:00:00.0" By="135" Duration="00:00:0.2"/>
        <DoubleAnimation Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)" BeginTime="00:00:00.2" Duration="00:00:00.1" To="0">
            <DoubleAnimation.EasingFunction>
                <QuinticEase EasingMode="EaseInOut"/>
            </DoubleAnimation.EasingFunction>
        </DoubleAnimation>
    </Storyboard>
</Window.Resources>

今...私のレイアウトは、いくつかの特定の基本値に基づいて動的に構築されています。また、アニメーションも同じように動作するようにしたいと思います。問題は、宣言を次のように変更すると(MultiBinding Converterの戻り値は完全に正しいので、再確認しました)、正しく機能しなくなることです。

<Storyboard Core:Key="MyKey" Completed="OnCompleted">
    <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" BeginTime="00:00:00.0" Duration="00:00:0.2">
        <DoubleAnimation.By>
            <MultiBinding Converter="{StaticResource MathConverter}" ConverterParameter="((x - y) / 2) + z + w">
                <Binding Source="{Core:Static Namespace:MyClass.RealHeight}"/>
                <Binding Source="{Core:Static Namespace:MyClass.RealWidth}"/>
                <Binding Source="{Core:Static Namespace:MyClass.MarginInner}"/>
                <Binding Source="{Core:Static Namespace:MyClass.RealWidth}"/>
            </MultiBinding>
        </DoubleAnimation.By>
    </DoubleAnimation>
    <DoubleAnimation Storyboard.TargetProperty="(FrameworkElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)" BeginTime="00:00:00.2" Duration="00:00:00.1" To="0">
        <DoubleAnimation.EasingFunction>
            <QuinticEase EasingMode="EaseInOut"/>
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
</Storyboard>

実行時デバッグ時の「By」値はnullです。ここでバインドが機能しないのはなぜですか?回避策はありますか?もちろん、コードビハインドでその値を手動で設定することは機能します...しかしまあ...

m_MyAnimation = (Storyboard)Resources["MyKey"];
((DoubleAnimation)m_MyAnimation.Children[0]).By = ((MyClass.RealHeight - MyClass.RealWidth) / 2D) + MyClass.MarginInner + MyClass.RealWidth;
4

1 に答える 1

0

問題は、Converterがすべての戻り値を処理する方法でした。

public Object Convert(Object[] values, Type targetType, Object parameter, CultureInfo culture)
{
    try
    {
        String text = parameter.ToString();
        IExpression expression = null;

        if (!m_Expressions.TryGetValue(text, out expression))
            m_Expressions[text] = expression = m_Parser.Parse(text);

        Decimal result = expression.Eval(values);

        if (targetType == typeof(Decimal))
            return result;

        if (targetType == typeof(Double))
            return (Double)result;

        if (targetType == typeof(Int32))
            return (Int32)result;

        if (targetType == typeof(Int64))
            return (Int64)result;

        if (targetType == typeof(String))
            return result.ToString();
    }
    catch { }

    return DependencyProperty.UnsetValue;
}

この種のアニメーション値はnull許容型です...そこで、すべてを魅力のように機能させるために、次のようにメソッドを変更しました。

public Object Convert(Object[] values, Type targetType, Object parameter, CultureInfo culture)
{
    try
    {
        String text = parameter.ToString();
        IExpression expression = null;

        if (!m_Expressions.TryGetValue(text, out expression))
            m_Expressions[text] = expression = m_Parser.Parse(text);

        Decimal result = expression.Eval(values);

        if (targetType.IsGenericType && (targetType.GetGenericTypeDefinition() == typeof(Nullable<>)))
            targetType = Nullable.GetUnderlyingType(targetType);

        if (targetType == typeof(Decimal))
            return result;

        if (targetType == typeof(Double))
            return (Double)result;

        if (targetType == typeof(Int32))
            return (Int32)result;

        if (targetType == typeof(Int64))
            return (Int64)result;

        if (targetType == typeof(String))
            return result.ToString();
    }
    catch { }

    return DependencyProperty.UnsetValue;
}
于 2013-02-18T13:21:11.377 に答える