gpt4 book ai didi

WPF检测滚动父控件

转载 作者:行者123 更新时间:2023-12-04 03:46:54 25 4
gpt4 key购买 nike

想象一下你打开一个 WPF Popup 的情况(例如,通过 ButtonClick)。
您有一个 ListBox直接在Popup有一些项目,所以你必须能够滚动。
想象一下,这是您的 Custom Control它位于 ScrollViewer .

现在,如果您将鼠标从 Popup 移到外面表面和滚动,会发生什么?
您上下滚动,但使用 Popup打开了!这就是问题所在。

问题是,如何从控件内部检测到 VisualTree 中其他一些未知的父控件已开始滚动?
并连续设置 IsDropDownOpen = false ?

最佳答案

我们可以编写一个触发器用于包含在 ScrollViewer 中的元素。 .这是一个完整的示例应用程序:

<Grid>
<ScrollViewer VerticalAlignment="Top" Height="200">
<StackPanel HorizontalAlignment="Left">
<Button Name="button" Content="Open">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:ChangePropertyAction TargetObject="{Binding ElementName=popup}" PropertyName="IsOpen" Value="True"/>
</i:EventTrigger>
<local:ScrollTrigger>
<ei:ChangePropertyAction TargetObject="{Binding ElementName=popup}" PropertyName="IsOpen" Value="False"/>
</local:ScrollTrigger>
</i:Interaction.Triggers>
</Button>
<Popup Name="popup" PlacementTarget="{Binding ElementName=button}">
<TextBlock Background="White" Text="Sample text"/>
</Popup>
<Rectangle Width="100" Height="100" Fill="Red"/>
<Rectangle Width="100" Height="100" Fill="Green"/>
<Rectangle Width="100" Height="100" Fill="Blue"/>
<Rectangle Width="100" Height="100" Fill="Yellow"/>
</StackPanel>
</ScrollViewer>
</Grid>

我们有一个按钮可以打开 Popup以及任何父级中的任何滚动 ScrollViewer导致 ScrollTrigger触发 Action ,然后我们可以关闭弹出窗口。请注意,触发器连接到 Button而不是 Popup .我们可以使用可视化树中的任何附近元素。另请注意,我们使用另一个触发器打开 Popup但它如何打开对于最初的问题并不重要。

这是 ScrollTrigger :
class ScrollTrigger : TriggerBase<FrameworkElement>
{
protected override void OnAttached()
{
AssociatedObject.Loaded += new RoutedEventHandler(AssociatedObject_Loaded);
}

void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
foreach (var scrollViewer in GetScrollViewers())
scrollViewer.ScrollChanged += new ScrollChangedEventHandler(scrollViewer_ScrollChanged);
}

void scrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
InvokeActions(e.OriginalSource);
}

IEnumerable<ScrollViewer> GetScrollViewers()
{
for (DependencyObject element = AssociatedObject; element != null; element = VisualTreeHelper.GetParent(element))
if (element is ScrollViewer) yield return element as ScrollViewer;
}
}
ScrollTrigger很简单,它只是附加到所有父级 ScrollChanged事件并触发任何包含的操作。在示例中,我们使用 ChangePropertyAction关闭 Popup .

如果您不熟悉行为,请安装 Expression Blend 4 SDK 并添加以下命名空间:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

并添加 System.Windows.InteractivityMicrosoft.Expression.Interactions到您的项目。

关于WPF检测滚动父控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2309883/

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