我有一个ScrollViewer,它包装了一堆动态创建的TextBox控件。 HorizontalScrollBarVisibility
和VerticalScrollBarVisibility
都设置为隐藏。我以编程方式滚动ScrollViewer以响应用户滚动网格视图。
我遇到的问题是,当用户将焦点放在其中一个TextBox元素上,然后按左/右箭头键时,ScrollViewer就会滚动。我想阻止这种手动滚动,只允许编程滚动。显然,禁用ScrollViewer不是一个选项,因为用户需要能够在其中的TextBox中添加文本。同样,将HorizontalScrollBarVisibility
属性设置为已禁用也不起作用,因为它会将滚动偏移重置为零。
如何锁定滚动或阻止手动滚动?
答案 0 :(得分:0)
通过删除滚动条的手动操作并隐藏它们,你基本上说你想要的东西有一个项目列表,可以从代码中滚动,但不是ListBox ...
结论:不要使用ListBox:)
当您自己管理滚动时,为什么不在画布内的StackPanel下使用TextBoxes(当然,使用剪切矩形)。然后使用StackPanel上的Canvas.Top/Left属性滚动它。
以下示例就是这样做的。我添加了一个滑块绑定到 Canvas.Top 属性,以便您可以测试它。
<UserControl x:Class="SilverlightApplication1.NotAListbox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Canvas Background="Aquamarine" HorizontalAlignment="Center" Name="canvas1" VerticalAlignment="Center" Width="200" Height="200">
<Canvas.Clip>
<RectangleGeometry Rect="0,0,200,200"></RectangleGeometry>
</Canvas.Clip>
<StackPanel Canvas.Top="{Binding ElementName=slider1, Path=Value}" Name="stackPanel1">
<TextBox Height="23" Text="textBox 1" Width="120" />
<TextBox Height="23" Text="textBox 2" Width="120" />
<TextBox Height="23" Text="textBox 3" Width="120" />
<TextBox Height="23" Text="textBox 4" Width="120" />
<TextBox Height="23" Text="textBox 5" Width="120" />
<TextBox Height="23" Text="textBox 6" Width="120" />
<TextBox Height="23" Text="textBox 7" Width="120" />
<TextBox Height="23" Text="textBox 8" Width="120" />
<TextBox Height="23" Text="textBox 9" Width="120" />
</StackPanel>
</Canvas>
<Slider Height="171" HorizontalAlignment="Center" Margin="316,62,57,66" Name="slider1" VerticalAlignment="Center" Width="27" Orientation="Vertical" Minimum="-223" Maximum="200" />
</Grid>
</UserControl>