gpt4 book ai didi

wpf - Items控制项,走出视野

转载 作者:行者123 更新时间:2023-12-04 19:46:55 24 4
gpt4 key购买 nike

我有一个 ScrollViewer,其中有一个 ItemsControlItemsControl 绑定(bind)到 ObservableCollectionItemsControl 有一个 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 属性。然后,您还需要将其 BindPopup.IsOpen 属性:

<Popup IsOpen="{Binding IsPopupOpen}" StaysOpen="False" ... />

更新>>>

ScrollViewer.ScrollChanged 事件将在 ScrollViewer 滚动时被频繁调用。直接在该事件处理程序中执行任何代码确实是不明智的,但是 ScrollChangedEventArgs 对象有一些可以帮助我们的属性。请看ScrollChangedEventArgs Class MSDN 上的页面以获取这些属性的完整详细信息。

您可以在名为 VerticalChangeHorizo​​ntalChange 的事件处理程序中访问两个属性,这两个属性应该向您显示 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com