Ошибка возникает, когда я нажимаю кнопку 3-4 раза в секунду. Проблема анимации - PullRequest
1 голос
/ 12 ноября 2010

Я создал один пользовательский элемент управления.Это метод, который вызывает проблемы: -

private void Update(object newContent)
        {
            //lock (this)
            //{
                if (grid == null)
                    base.ApplyTemplate();

                ContentControl oldWrapper = this.currentWrappedControl;
                if (oldWrapper != null)
                {
                    VisualStateGroup layoutStatesGroup = findNameInWrapper(oldWrapper, "LayoutStates") as VisualStateGroup;

                    if (layoutStatesGroup == null)
                    {
                        this.grid.Children.Remove(oldWrapper);
                        setContent(oldWrapper, null);
                    }
                    else
                    {
                        layoutStatesGroup.CurrentStateChanged += delegate(object sender, VisualStateChangedEventArgs args)
                        {

                            this.grid.Children.Remove(oldWrapper);
                            setContent(oldWrapper, null);
                        };
                        VisualStateManager.GoToState(oldWrapper, "BeforeUnloaded", true);
                    }
                }

                ContentControl newWrapper = new ContentControl();
                newWrapper.Style = TransitionStyle;
                newWrapper.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
                newWrapper.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
                grid.Children.Add(newWrapper);
                newWrapper.ApplyTemplate();
                if (this.TransitionStyle != null)
                {
                    setContent(newWrapper, newContent);
                    if (oldWrapper != null)
                    {
                        VisualStateManager.GoToState(newWrapper, "BeforeLoaded", false);
                        VisualStateManager.GoToState(newWrapper, "AfterLoaded", true);
                    }
                }
                this.currentWrappedControl = newWrapper;
            //}
        }

Все работает хорошо, если я нажимаю кнопки медленно.Но если я нажимаю кнопку беспокойно, она вылетает, и я получаю эту ошибку: -

Microsoft JScript runtime error: Unhandled Error in Silverlight Application Value does not fall within the expected range.   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
   at MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, DependencyObject doh)
   at MS.Internal.XcpImports.SetValue(IManagedPeerBase doh, DependencyProperty property, Object obj)
   at System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp, Object value)
   at System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty property, EffectiveValueEntry& newEntry, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
   at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet)
   at System.Windows.Controls.ContentPresenter.set_Content(Object value)
   at SilverlightTransitionEffect.TransitionalControl.setContent(ContentControl control, Object Content)
   at SilverlightTransitionEffect.TransitionalControl.Update(Object newContent)
   at SilverlightTransitionEffect.TransitionalControl.OnContentChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp, Object oldValue, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
   at System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp)
   at System.Windows.DependencyPropertyChangedWeakListener.SourcePropertyChanged(DependencyObject c, DependencyProperty dp)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyProperty dp)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyProperty dp)
   at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp, Object oldValue, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
   at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet)
   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   at SilverlightTransitionEffect.Slideshow.set_SelectedItem(Object value)
   at SilverlightTransitionEffect.Slideshow.btnRightButton_Click(Object sender, RoutedEventArgs e)
   at System.Windows.Controls.Primitives.ButtonBase.OnClick()
   at System.Windows.Controls.Button.OnClick()
   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

Я даже пытался заблокировать объект, но проблема все еще та же.

Это мое визуальное состояние: -

 <Style x:Key="SlideTemplate" TargetType="ContentControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ContentControl">
                    <Grid x:Name="grid" Background="{TemplateBinding Background}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="LayoutStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0:0:0.5">
                                        <VisualTransition.GeneratedEasingFunction>
                                            <CubicEase EasingMode="EaseOut"/>
                                        </VisualTransition.GeneratedEasingFunction>
                                    </VisualTransition>
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="BeforeLoaded">
                                    <Storyboard >
                                        <DoubleAnimation Duration="0" To="500" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="grid"/>
                                        <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="AfterLoaded"/>
                                <VisualState x:Name="BeforeUnloaded">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" To="-1000" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="grid"/>
                                        <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Grid.RenderTransform>
                            <CompositeTransform/>
                        </Grid.RenderTransform>

                        <ContentPresenter x:Name="contentPresenter"  Content="{TemplateBinding Content}" />

                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Заранее спасибо:)

Ооо!и я забыл сказать, что анимация запускается, когда я нажимаю кнопки.

1 Ответ

0 голосов
/ 29 ноября 2010

У меня была похожая проблема при добавлении пользовательского элемента управления в сетку.

Я не эксперт по именованию областей в Silverlight, но думаю, что это может быть вашей проблемой. В вашем шаблоне управления указана корневая сетка с именем (x:Name="grid"). Когда вы начинаете динамически добавлять ContentControls с помощью этого шаблона в grid через строку grid.Children.Add(newWrapper);, имена перестают быть уникальными (т. Е. У вас есть несколько элементов управления с именем grid, потому что каждый newWrapper имеет шаблон с корневым элементом управления с этим именем). Попробуйте дать динамически созданному ContentControl уникальное значение для Name (уникальное в контексте дочерних элементов Grids) перед добавлением его в коллекцию Grid.Children, т.е.

ContentControl newWrapper = new ContentControl();

newWrapper.Name = "someUniqueName"; //ensure this is uniquely generated on each call

newWrapper.Style = TransitionStyle;
newWrapper.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
newWrapper.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
grid.Children.Add(newWrapper);

Опять же, поскольку я не эксперт по именованию областей, я не уверен, как это повлияет на ваши состояния VSM, когда StoryBoards предназначаются для элемента управления с именем grid. По крайней мере, вы будете знать, если это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...