天天看點

【UWP】如何擷取ListView/GridView控件内置ScrollViewer對象

UWP項目需要在使用者滾動ListView時做出響應,實時調節某些控件的屬性.

觀察ListView預設的Template, XAML代碼如下:

<ControlTemplate TargetType="ListView">
	<Border Background="{TemplateBinding Background}"
			BorderThickness="{TemplateBinding BorderThickness}"
			BorderBrush="{TemplateBinding BorderBrush}"
			CornerRadius="{TemplateBinding CornerRadius}">
		<ScrollViewer x:Name="ScrollViewer"
					  AutomationProperties.AccessibilityView="Raw"
					  BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
					  HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
					  HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
					  IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
					  IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
					  IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
					  IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
					  IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
					  TabNavigation="{TemplateBinding TabNavigation}"
					  VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
					  VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
					  ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
			<ItemsPresenter Footer="{TemplateBinding Footer}"
							FooterTransitions="{TemplateBinding FooterTransitions}"
							FooterTemplate="{TemplateBinding FooterTemplate}"
							Header="{TemplateBinding Header}"
							HeaderTransitions="{TemplateBinding HeaderTransitions}"
							HeaderTemplate="{TemplateBinding HeaderTemplate}"
							Padding="{TemplateBinding Padding}"/>
		</ScrollViewer>
	</Border>
</ControlTemplate>
           

容易看出ListView内僅包含一個Border,其中嵌套了一個ScrollViewer.

是以可定義一個

ScrollViewer

變量

ListScrollViewer

, 在ListView加載完成後調用VisualTreeHelper提供的GetChild方法擷取這個ScrollViewer.

推薦在ListView的Loaded事件中調用此方法, 若在其他地方調用, 最好先用

VisualTreeHelper.GetChildenrCount()

确認ListView已加載.

此後即可添加對

ScrollViewer.ViewChanged

等事件的響應, 或是直接調用ScrollViewer的方法, 極其友善.

繼續閱讀