【发布时间】:2018-11-28 22:04:16
【问题描述】:
我已经为此奋斗了几天,只是找不到答案。希望这里有人可以提供帮助。
我们有一个动画键盘,当用户选择需要键盘输入的 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,所以没有人注意到。但是,当我向模型添加新视图时,它会在关闭我的视图时崩溃,因此它不会返回到之前的视图。
【问题讨论】:
-
对于一个简单的任务来说,代码似乎有点过于复杂。你也可以分享故事板的代码
HideKeyboard。您看到的异常仅在输出/调试窗口中,否则应用程序崩溃。 -
为了笑容,我完全消除了键盘故事板。因此,键盘可见或不可见。根本没有动画。另外,我注释掉了 tt.BeginAnimation() 调用。因此,剩下的就是变换的创建和分配,但它从未被使用过。仅此一项就会在尝试关闭应用程序时使应用程序崩溃。同样,因为转换显然是不可变的。如果我知道如何改变这一点,我会很成功。
-
如果我理解正确,您希望键盘在文本框获得焦点时滑入,在关闭或文本框失去焦点时滑出。我可以根据附加属性编写一个解决方案,你可以吗?我问它是因为在这种情况下,我们可能还需要调整您的一些代码。此外,如果您可以共享代码的工作示例,那么将其与您的解决方案集成起来会更容易。
标签: wpf rendertransform