我创建了一个自定义控件。这是导致问题的方法: -
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>
提前致谢:)
喔!而且我忘了告诉单击按钮时动画会运行。
答案 0 :(得分:0)
在向网格添加自定义UserControl时,我遇到了类似的问题。
我不是Silverlight中命名范围的专家,但我认为这可能是你的问题。在控件模板中,您具有指定名称(x:Name="grid"
)的根网格。当您开始使用此模板通过行grid
向grid.Children.Add(newWrapper);
动态添加ContentControl时,名称不再是唯一的(即您有多个名为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的控件。至少你会知道这是不是问题。