- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 ScrollViewer
,其中有一个 ItemsControl
。 ItemsControl
绑定(bind)到 ObservableCollection
。 ItemsControl
有一个 ItemTemplate
,我在其中提供了一个 TextBox
来显示数据。
数据正在正确显示。我已经向每个 TextBox
添加了一个弹出窗口,以显示附加数据,并将放置目标设置为 Top。
我面临的问题是,当我滚动某个项目时,如果某个项目超出 View ,我需要隐藏弹出窗口并在该项目出现时再次显示它。
我已经订阅了 scrollviewer 的 ScrollChanged
事件,但是我如何获取超出范围以隐藏弹出窗口的项目/TextBox
?
最佳答案
您可以使用 Determining the Visibility of Elements inside ScrollViewer 中的方法Lester 的 WPF\SL 博客上的文章,以确定特定项目是否在 ScrollViewer
中可见。来自该博客:
// position of your visual inside the scrollviewer
GeneralTransform childTransform = ContainedObject.TransformToAncestor(ScrollViewerObj);
Rect rectangle = childTransform.TransformBounds(new Rect(new Point(0,0),
ContainedObject.RenderSize));
// Check if the elements Rect intersects with that of the scrollviewer's
Rect result = Rect.Intersect(new Rect(new Point(0, 0), ScrollViewerObj.RenderSize),
rectangle);
// if result is Empty then the element is not in view
if (result == Rect.Empty)
{
ContainedObject.IsPopupOpen = false; // <<< Close relevant popup here
}
else
{
//obj is partially Or completely visible
//skip or bring obj in view.
}
很明显,要使其正常工作,您需要向数据对象添加一个新的 bool IsPopupOpen
属性,该数据对象绑定(bind)到 TextBox.Text
属性。然后,您还需要将其 Bind
到 Popup.IsOpen
属性:
<Popup IsOpen="{Binding IsPopupOpen}" StaysOpen="False" ... />
更新>>>
ScrollViewer.ScrollChanged
事件将在 ScrollViewer
滚动时被频繁调用。直接在该事件处理程序中执行任何代码确实是不明智的,但是 ScrollChangedEventArgs
对象有一些可以帮助我们的属性。请看ScrollChangedEventArgs
Class MSDN 上的页面以获取这些属性的完整详细信息。
您可以在名为 VerticalChange
和 HorizontalChange
的事件处理程序中访问两个属性,这两个属性应该向您显示 ScrollViewer
有多少自上次事件以来已滚动。 [现在已经有一段时间了,所以我不能保证它们是正确的属性,但是如果您使用 ScrollChangedEventArgs.VerticalChange
Property 中的示例代码在您的事件处理程序中的 MSDN 页面上,读出的内容应该会为您提供有关使用哪些正确属性的线索。]
因此,找到相关属性后,您可以在您的处理程序中使用它们来确定是否执行您的代码......尝试这样的事情:
double totalVerticalChange = 0.0;
double minimumValue = 24.0; // set this to whatever you want as a minimum scroll value
...
private void ScrollViewer_Changed(object sender, ScrollChangedEventArgs e)
{
if (totalVerticalChange + e.VerticalChange >= minimumValue)
{
totalVerticalChange = 0.0;
// perform your functionality here
}
else totalVerticalChange += e.VerticalChange;
}
如果这里有错误,请原谅我,因为我目前无法在 Visual Studio 中检查它,但希望你明白了......本质上,这就像我们正在“过滤”一些事件。
关于wpf - Items控制项,走出视野,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19421845/
我在 div 中创建了 li。但是,li显示在div之外。 .container>div { width: 50%; border: 1px solid red; } div ul { l
我是一名优秀的程序员,十分优秀!