1

ブレンド4を使用してwpfアプリケーションを作成しています

私はxamlで定義されたwrapPanelを持っています:

<WrapPanel x:Name="WrapPanel_ShowMe">

特定の視覚状態に入ると、wrapPanel の分離コードが新しい場所に移動します。

WrapPanel_ShowMe.RenderTransform = new TranslateTransform(0,-661.5);

この状態では、状態に異なるwrapPanelsが表示される可能性があるため、このようにしています(状態の複製を防ぐため)

状態を終了した後、パネルを元の場所に戻します。

また、同じ wrapPanel が他の状態で xaml によって移動されています。

<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="WrapPanel_ShowMe">
    <EasingDoubleKeyFrame KeyTime="0" Value="-648"/>
</DoubleAnimationUsingKeyFrames>

そのため、状態 A は C# で wrapPanel を移動し、状態 B は xaml を使用してパネルを移動します。

状態Bを使用すると、wrapPanelは問題なく動きます。(xaml)

状態Aを使用すると、wrapPanelは問題なく動きます。(c#)

問題は、状態 A を使用してパネルを移動し、状態 B のあとがきを使用しようとすると発生します。プログラムがクラッシュしますが、原因がわかりません。コード ビハインドを使用してオブジェクトを移動した後、xaml レンダリング変換が有効ではなくなったようですか?

これがなぜなのか、そしてそれを修正/回避する方法を誰か教えてもらえますか?

前もって感謝します

編集

スタックの結果は次のとおりです。

Unhandled Exception: System.InvalidOperationException: 'Children' property value in the path '(0).(1)[3].(2)' points to immutable instance of 'System.Windows.Media.TransformCollection'.
   at System.Windows.Media.Animation.Storyboard.VerifyPathIsAnimatable(PropertyPath path)
   at System.Windows.Media.Animation.Storyboard.ClockTreeWalkRecursive(Clock currentClock, DependencyObject containingObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehavior handoffBehavior, HybridDictionary clockMappings, Int64 layer)
   at System.Windows.Media.Animation.Storyboard.ClockTreeWalkRecursive(Clock currentClock, DependencyObject containingObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehavior handoffBehavior, HybridDictionary clockMappings, Int64 layer)
   at System.Windows.Media.Animation.Storyboard.BeginCommon(DependencyObject containingObject, INameScope nameScope, HandoffBehavior handoffBehavior, Boolean isControllable, Int64 layer)
   at System.Windows.VisualStateGroup.StartNewThenStopOld(FrameworkElement element, Storyboard[] newStoryboards)
   at System.Windows.VisualStateManager.GoToStateInternal(FrameworkElement control, FrameworkElement stateGroupsRoot, VisualStateGroup group, VisualState state, Boolean useTransitions)
   at Microsoft.Expression.Interactivity.Core.ExtendedVisualStateManager.TransitionEffectAwareGoToStateCore(FrameworkElement control, FrameworkElement stateGroupsRoot, String stateName, VisualStateGroup group, VisualState state, Boolean useTransitions, VisualTransition transition, Boolean animateWithTransitionEffect, VisualState previousState)
   at Microsoft.Expression.Interactivity.Core.ExtendedVisualStateManager.GoToStateCore(FrameworkElement control, FrameworkElement stateGroupsRoot, String stateName, VisualStateGroup group, VisualState state, Boolean useTransitions)
   at System.Windows.VisualStateManager.GoToStateCommon(FrameworkElement control, FrameworkElement stateGroupsRoot, String stateName, Boolean useTransitions)
   at Microsoft.Expression.Interactivity.VisualStateUtilities.GoToState(FrameworkElement element, String stateName, Boolean useTransitions)
   at System.Windows.Interactivity.TriggerBase.InvokeActions(Object parameter)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.Controls.Button.OnClick()
   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run()
   at TrailerUnitNewTutor_1.App.Main() in c:\Users\Domnick\Documents\Expression\Blend 4\Projects\TrailerUnitNewTutor_1\TrailerUnitNewTutor_1\obj\Debug\App.g.cs:line 0
4

1 に答える 1

0

XAML とコード ビハインドは、2 つの異なる RenderTransform を構築しています。XAML ストーリーボードから、WrapPanel.RenderTransform は次のようになると想定しています。

<WrapPanel.RenderTransform>
    <TransformGroup>
        <ScaleTransform/>
        <SkewTransform/>
        <RotateTransform/>
        <TranslateTransform/>
    </TransformGroup>
</WrapPanel.RenderTransform>

コードで作成している RenderTransform は、XAML では次のようになります。

<WrapPanel.RenderTransform>
    <TranslateTransform/>
</WrapPanel.RenderTransform>

これを修正する最も簡単な方法は、XAML で RenderTransform をコードで設定されている方法に設定することです。つまり、他の変換を使用しないことを前提としています。それが機能しない場合は、コードで、時間ゼロで TranslateTransform を設定する Storyboard を作成します。

于 2012-06-25T22:28:53.763 に答える