当一些包含的控件第一次可见时,WPF UserControl在ElementHost内意外滚动,但只是第一次

时间:2015-06-08 21:58:22

标签: wpf winforms winforms-interop

好的,所以......

我们有一个大毛茸茸的WPF UserControl,代表用户填写的表单。它位于包含Panel的WinForms对话框中的ElementHost中(实际上,有多个嵌套面板)。用户控件包含的元素的可见性设置为Collapsed(绑定到布尔DataContext属性,其中true转换为Visible,false转换为Collapsed)最初加载窗体时。稍后,当向下滚动用户控件并单击复选框或单选按钮(使用鼠标或空格键)时,绑定属性将从false更改为true,并且隐藏的元素将变为可见。此时,包含大用户控件的内容决定滚动到(0,0),因此所有内容都会消失(即,在视口下方滚动)。

但是,如果用户滚动回到原来的位置并再次单击该复选框(因此先前隐藏的元素的可见性会变回false,然后再次返回true),此自动滚动行为不会t第二次发生。它只发生在加载东西后的第一次点击。

当大型用户控件未显示在ElementHost中时,不会发生此问题(实际上,因为没有什么是简单的,我们有一个WinForms对话框,其中嵌入了ElementHost)。我们有一个“预览模式”,可以在自己的WPF对话框中调出大用户控件,没有WinForms废话。

我已经在我能看到的所有内容(递归树行走)上挂起了SizeChanged,ScrollChanged和RequestBringIntoView事件处理程序,以及每个祖先ScrollableControl上的WinForms Scroll事件的处理程序,直到树的根。 (这件事似乎打破了Snoop,只是为了让你了解代码库。:))似乎没有发生意外事件,但确实发生的一件事是SizeChanged事件发生在隐藏元素上,因为它们变得可见。但是,当它们返回折叠后再次显示时,那些SizeChanged事件不会再次发生。

我该怎么办?这种“形式”用户控件可能是一个怪异的东西(用户定义的),所以强制一切都在加载时可见,所以它可以在隐藏事物之前得到布局不是真正的选择(虽然我想我可以试试,只是看看是否有帮助)。是否有一些已知的与ElementHost的特质,和/或我错过了一些神奇的咒语?

感谢。

0 个答案:

没有答案