聚焦放置在 ScrollViewer 内的 UIElement 导致 UIElement 滚动到视图中,我可以禁用它吗?
Focusing an UIElement placed inside a ScrollViewer causing the UIElement to be scrolled into the view, can I disable this?
是否可以在 WPF 框架中禁用默认 ScrollViewer 的这种内置行为?场景如下:
- 我有一个 ScrollViewer,里面有一个 StackPanel。
- 在 StackPanel 中有许多 UIElement(例如 TextBox 控件)
- 使用 Focus() 方法聚焦其中一个 TextBox 控件(当前不可见)会导致 TextBox 进入视图,使其可见。
我想禁用此行为,但不确定如何处理。我需要编写自己的 ScrollViewer 控件还是有一个附加的 属性 我不知道禁用此 "ScrollIntoView" 逻辑。以下是场景的一些代码片段:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel>
<Button Content="Focus Item 6" Margin="10" Click="Button_Click"/>
<TextBox Text="Lost focus" Margin="10"/>
</StackPanel>
<ScrollViewer Grid.Row="1">
<StackPanel>
<TextBox Text="Item 1" Height="100" x:Name="Item1"/>
<TextBox Text="Item 2" Height="100" x:Name="Item2"/>
<TextBox Text="Item 3" Height="100" x:Name="Item3"/>
<TextBox Text="Item 4" Height="100" x:Name="Item4"/>
<TextBox Text="Item 5" Height="100" x:Name="Item5"/>
<TextBox Text="Item 6" Height="100" x:Name="Item6"/>
</StackPanel>
</ScrollViewer>
</Grid>
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Item6.Focus();
}
感谢您的帮助。
通过互联网进行更深入的搜索后,我发现 this answer。感谢 AndrewS 在该线程中的回答。基本上我必须做的是处理 ScrollViewer 控件内面板的 RequestBringIntoView 事件,或者在我的示例中 StackPanel.
是否可以在 WPF 框架中禁用默认 ScrollViewer 的这种内置行为?场景如下:
- 我有一个 ScrollViewer,里面有一个 StackPanel。
- 在 StackPanel 中有许多 UIElement(例如 TextBox 控件)
- 使用 Focus() 方法聚焦其中一个 TextBox 控件(当前不可见)会导致 TextBox 进入视图,使其可见。
我想禁用此行为,但不确定如何处理。我需要编写自己的 ScrollViewer 控件还是有一个附加的 属性 我不知道禁用此 "ScrollIntoView" 逻辑。以下是场景的一些代码片段:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel>
<Button Content="Focus Item 6" Margin="10" Click="Button_Click"/>
<TextBox Text="Lost focus" Margin="10"/>
</StackPanel>
<ScrollViewer Grid.Row="1">
<StackPanel>
<TextBox Text="Item 1" Height="100" x:Name="Item1"/>
<TextBox Text="Item 2" Height="100" x:Name="Item2"/>
<TextBox Text="Item 3" Height="100" x:Name="Item3"/>
<TextBox Text="Item 4" Height="100" x:Name="Item4"/>
<TextBox Text="Item 5" Height="100" x:Name="Item5"/>
<TextBox Text="Item 6" Height="100" x:Name="Item6"/>
</StackPanel>
</ScrollViewer>
</Grid>
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Item6.Focus();
}
感谢您的帮助。
通过互联网进行更深入的搜索后,我发现 this answer。感谢 AndrewS 在该线程中的回答。基本上我必须做的是处理 ScrollViewer 控件内面板的 RequestBringIntoView 事件,或者在我的示例中 StackPanel.