我已经为此奋斗了几天,只是找不到答案。希望这里有人可以提供帮助。
我们有一个动画键盘,当用户选择需要键盘输入的 Textblock 控件时会弹出。动画键盘的代码很好。但它调用代码来调整包含 textblock 控件的网格,以便 textblock 控件始终位于动画键盘的正上方。我看到的问题是,当包含网格的页面关闭时,路径 '(0).(1)[0].(2)' 中的 'Children' 属性值异常指向不可变实例'System.Windows.Media.TransformCollection' 在这一行:
_AppWindowControl.IsEnabled = false;
移除键盘时调用的代码(由“完成”按键隐藏)是这样的:
/// <summary>
/// Animation to hide keyboard
/// </summary>
private void HideKeyboard()
{
if (_verticalOffset != 0)
{
TranslateTransform tt = new TranslateTransform();
DoubleAnimation slide = new DoubleAnimation(_verticalOffset, 0, TimeSpan.FromMilliseconds(400));
var name = "myTransform" + tt.GetHashCode();
_mainGrid.RegisterName(name, tt);
name = "mySlide" + slide.GetHashCode();
_mainGrid.RegisterName(name, slide);
_mainGrid.RenderTransform = tt;
tt.BeginAnimation(TranslateTransform.YProperty, slide);
_verticalOffset = 0;
}
Storyboard sb = (Storyboard)this.TryFindResource("HideKeyboard");
sb.Completed += new EventHandler(HideKeyboard_Completed);
sb.Begin(this);
}
我添加了名称注册,希望能解决问题。但事实并非如此。如果我删除分配_mainGrid.RenderTransform = tt;
,则 appWindow 将关闭而不会出现任何错误。
另外,我说关闭键盘时会出现问题。这段代码只是最容易显示的。当键盘出现时,会调用 AdjustScreen,它会创建类似的 TranslateTransform 分配给 _mainGrid.RenderTransform。同样,如果我删除分配,则不会出现问题(也不会出现动画)。否则,将发生上述相同的错误。
任何帮助将不胜感激。谢谢!
编辑。这是 xaml 文件中的 StoryBoard:
<Storyboard x:Key="HideKeyboard">
<DoubleAnimationUsingKeyFrames AccelerationRatio=".75" BeginTime="00:00:00" DecelerationRatio=".25" Storyboard.TargetName="KeyboardGrid" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
<!--<SplineDoubleKeyFrame KeyTime="00:00:00.20" Value="-10" />-->
<!--<SplineDoubleKeyFrame KeyTime="00:00:00.45" Value="450" />-->
<SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="450" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>`enter code here`
此外,我有一个解决方法,基本上在此处更改 _mainGrid.RenderTransfrom 之前存储它。然后,当调用 HideKeybaord_Completed 处理程序时,它会将其还原。这种方法有效。但这似乎很hackish。
崩溃是应用程序崩溃。大多数时候,我们无论如何都会退出 UI,所以没有人注意到。但是,当我向模型添加一个新视图时,它会在关闭我的视图时崩溃,因此它不会返回到以前的视图。