c# - 自定义 ScrollViewer 样式中断 RichTextBox 鼠标滚轮滚动
问题描述
要重现这一点,只需将此样式添加到任何具有 RichTextBox 的 wpf 项目中:
一个完整的最小项目可以在这里找到: https ://drive.google.com/file/d/1a7e-vwKpt1Emg7fhMhVRLccwrjOlhWk1/view?usp=sharing
也是这两种风格的一个例子:
<!--
This style does NOT break RichTextBox Scrolling
-->
<Style TargetType="{x:Type ScrollViewer}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
</Style.Resources>
</Style>
<!--
The Style below breaks Rich Text Box
-->
<!--<Style TargetType="{x:Type ScrollViewer}">
<Setter Property="CanContentScroll" Value="True"></Setter>
<Setter Property="PanningMode" Value="Both"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollContentPresenter Grid.Column="0" />
<ScrollBar
x:Name="PART_VerticalScrollBar"
Grid.Row="0"
Grid.Column="1"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
Value="{TemplateBinding VerticalOffset}" />
<ScrollBar
x:Name="PART_HorizontalScrollBar"
Grid.Row="1"
Grid.Column="0"
Maximum="{TemplateBinding ScrollableWidth}"
Orientation="Horizontal"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
Value="{TemplateBinding HorizontalOffset}" />
--><!--<Rectangle Grid.Row="1" Grid.Column="1" Fill="Red"/>--><!--
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>-->
然后在样式的底部,注释掉任一 ScrollViewer 样式以在它们之间进行交换。一个简单地覆盖右下角的矩形颜色。另一个做同样的事情,但也定义了滚动条。定义滚动条的样式会中断垂直滚动。
这也可以使用 Microsoft 提供的官方样式复制,位于此处:
和这里
更新:(上面的链接很快就会成为一个无效的例子,因为这个问题已经被提交了,并且显然会得到解决和修复)
有谁知道为什么为 ScrollViewers 声明自定义样式会破坏 RichTextBox 鼠标滚轮滚动?
编辑:还应该注意的是,上面的示例不会阻碍或破坏任何其他控件的垂直鼠标滚轮滚动(我已经注意到)。RichTextBox 似乎是一个边缘案例。
解决方案
找到了解决方案,实际上很简单。
您必须添加CanContentScroll="True"
到控件模板中ScrollContentPresenter
。ScrollViewer
这是一个例子:
<Style TargetType="{x:Type ScrollViewer}">
<Setter Property="CanContentScroll" Value="True"></Setter>
<Setter Property="PanningMode" Value="Both"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollContentPresenter CanContentScroll="True" Grid.Column="0" />
<ScrollBar
x:Name="PART_VerticalScrollBar"
Grid.Row="0"
Grid.Column="1"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
Value="{TemplateBinding VerticalOffset}" />
<ScrollBar
x:Name="PART_HorizontalScrollBar"
Grid.Row="1"
Grid.Column="0"
Maximum="{TemplateBinding ScrollableWidth}"
Orientation="Horizontal"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
Value="{TemplateBinding HorizontalOffset}" />
<Rectangle Grid.Row="1" Grid.Column="1" Fill="Red"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这在 microsoft 样式示例中的任何地方都没有提到,他们也在他们建议的样式模板中省略了它。
推荐阅读
- python - 使用 Transformers 中的 BertForTokenClassification 进行序列标记
- optimization - 向量化索引识别以加快 GPU 处理速度
- javascript - 单击按钮时,使用 reactjs 更改单击按钮的类名以及该组中的其他按钮
- asp.net - ASP.NET Core 将 int 值从 ajax 传递给 View
- typescript - 打字稿:要求枚举中的所有键都是有效类型
- neo4j - neo4j 发现所有连接非常慢
- xamarin.forms - 如何知道 Xamarin ListView 是否聚焦
- typescript - 单击 SVG 图标以标记复选框 - Protractor - TypeScript
- php - 带有敏感数据的订单状态链接(无身份验证/登录)
- javascript - 使用 jquery 的 requirejs 错误