如何在C#中获得对ListBox
的ScrollViewer
的引用?我几乎尝试了所有我能想到的方法。ListBox位于WPF自定义控件中,因此我们使用Template.FindName
来获得对所有控件的引用。我的ListBox
如下所示:
<ListBox
x:Name="PART_SoundList"
ScrollViewer.CanContentScroll="False"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
Focusable="False"
FocusVisualStyle="{x:Null}"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
BorderThickness="0"
ItemContainerStyleSelector="{StaticResource ListBoxItemAlternatingStyleSelector}"
ItemsSource="{Binding}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" Height="850" Focusable="False" Panel.ZIndex="999" >
<WrapPanel.RenderTransform>
<TransformGroup>
<ScaleTransform CenterX="0" CenterY="0" ScaleX=".75" ScaleY=".57" />
</TransformGroup>
</WrapPanel.RenderTransform>
</WrapPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Template>
<ControlTemplate>
<ScrollViewer x:Name="Scroller" VerticalAlignment="Bottom" Focusable="False" Style="{StaticResource HorizontalScroller}" >
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Focusable="False" Panel.ZIndex="999" />
</ScrollViewer>
</ControlTemplate>
</ListBox.Template>
</ListBox>
Template.FindName("Scroller", this) as ScrollViewer
的结果是null
。
有什么想法吗?
5条答案
按热度按时间ilmyapht1#
您可能尝试过早获取对ScrollViewer的引用。尝试在加载的事件中移动代码并检查它是否仍返回null:
在customControl/窗体构造函数中:
x7yiwoj42#
我假设上面的XAML是CustomControl的ControlTemplate的一部分,对吗?我还假设您正在OnApplyTemplate()方法上获取控件部分,对吗?如果是这种情况,那么,我认为您需要做的是在找到ScrollViewer之前强制调用PART_SoundList.ApplyTemplate()。因此,自定义控件的代码应该如下所示:
mxg2im7a3#
对于那些来到这里寻求最初问题答案的人:
在C#中
或在VB中
XAML中的位置
smdncfj34#
使用对可视化树的递归调用从树中获取任何可视化对象。
这为您提供了一个从Visual树中获取所提及类型的Visual元素的通用方法。
yrdbyhpb5#
如果您打算使用参考滚动/检查视口大小,IScrollProvider应该足够了。
您可以在代码中像这样访问它(注意Claudiu等待加载事件的点):
然后水平和垂直滚动,只要你想和你的心的内容。