我有一个ScrollViewer
,其中包含多个RichTextBox
元素,每个元素都有垂直滚动条可见。我希望能够使用鼠标滚轮一次滚动 * 一个 * 元素:
- 如果
RichTextBox
具有焦点,则滚动该 - 否则,滚动
ScrollViewer
目前,如果RichTextBox
有焦点,* 和 * ScrollViewer
都会滚动。我相信这是因为它们都拦截了PreviewMouseWheel
-这意味着ScrollViewer
在RichTextBox
之前“看到”事件。这意味着我不能只将事件标记为在RichTextBox
中处理。
下面的repro XAML除了默认生成的代码外没有任何代码隐藏。(显然它看起来很糟糕,我的真实的应用程序 * 有点 * 好-但基本的“父ScrollViewer
中的多个可滚动元素“是相同的。)
<Window x:Class="RichTextBoxMouseWheel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="300" Width="500">
<ScrollViewer>
<StackPanel Orientation="Vertical">
<RichTextBox VerticalScrollBarVisibility="Visible" Height="200" Width="400" FontSize="40">
<FlowDocument>
<Paragraph>Paragraph 1</Paragraph>
<Paragraph>Paragraph 2</Paragraph>
<Paragraph>Paragraph 3</Paragraph>
</FlowDocument>
</RichTextBox>
<RichTextBox VerticalScrollBarVisibility="Visible" Height="200" Width="400" FontSize="40">
<FlowDocument>
<Paragraph>Paragraph 1</Paragraph>
<Paragraph>Paragraph 2</Paragraph>
<Paragraph>Paragraph 3</Paragraph>
</FlowDocument>
</RichTextBox>
</StackPanel>
</ScrollViewer>
</Window>
字符串
它看起来像这样:
x1c 0d1x的数据
.并如前所述的行为-如果RichTextBox
具有焦点,则ScrollViewer
和ScrollViewer
同时滚动。
有一个合理的论点是,这只是一个糟糕的UI设计开始,我应该避免嵌套滚动条。我可以 * 尝试 * 一个相当激进的重新设计,以避免这种情况,但我宁愿不,如果有一种方法,只是使现有的设计滚动,因为我想它。
2条答案
按热度按时间7z5jn7bk1#
这不是
PreviewMouseWheel
,而是MouseWheel
事件。你可以通过一个派生的控件来修复这个恼人的行为:
字符串
dphi5xsq2#
如果
RichTextBox
在您的情况下不是必需的,我建议将其更改为FlowDocumentScrollViewer
。字符串
https://imgur.com/gzg52Nl