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
과 ScrollTrigger
행동을 발사하고 우리가 팝업을 닫을 수 있습니다 원인 ScrollViewer
어떤 부모에있는 스크롤을 여는 버튼이 있습니다 : 여기에 완전한 샘플 응용 프로그램입니다. 트리거는 Popup
이 아니라 Button
에 연결됩니다. 우리는 비주얼 트리에있는 근처의 요소를 사용할 수 있습니다. 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
이벤트에 부착하고이 작업을 포함 발생합니다. 이 샘플에서는 Popup
을 닫기 위해 ChangePropertyAction
을 사용합니다. 당신이 행동에 익숙하지 않은 경우
, 익스프레션 블렌드 4 SDK를 설치하고 다음의 네임 스페이스를 추가
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
및 프로젝트에 System.Windows.Interactivity
및 Microsoft.Expression.Interactions
를 추가합니다.
동일한 질문과 문제가 있습니다. 내 그리드를 스크롤하고 사용자 지정 작업으로 내 팝업을 동일한 장소에 머물러있게하십시오! 나는 격자와 함께 팝업 스크롤해야합니다! – Evgeny