在 DocumentViewer 中禁用文本选择
Posted
技术标签:
【中文标题】在 DocumentViewer 中禁用文本选择【英文标题】:Disabling text selection in DocumentViewer 【发布时间】:2010-09-26 23:03:48 【问题描述】:简单的问题。如何在 WPF 中禁用 DocumentViewer 的文本选择?这是查看器显示 XPS 文档然后可以通过鼠标突出显示文本的功能。突出显示的文本也可以复制,但我已经禁用了它。我只是不知道如何禁用突出显示。
谢谢!
【问题讨论】:
【参考方案1】:您可以使用 IsFocusable=false。但是搜索框也会被禁用...
【讨论】:
这实际上解决了问题。对我来说,它也不会禁用搜索框,所以这是一个很好的解决方案。请注意,该属性称为Focusable
而不是 IsFocusable
。【参考方案2】:
我们通过覆盖嵌入在 DocumentViewer 控件中的 ScrollViewer 的 ControlTemplate 解决了这个问题。在“Window.Resources”中插入下面的样式:
<Style TargetType="x:Type ScrollViewer" x:Key="CustomScrollPresenter">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type ScrollViewer">
<Grid Background="TemplateBinding Panel.Background">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle Grid.Column="1" Grid.Row="1" Fill="DynamicResource x:Static SystemColors.ControlBrushKey" />
<ScrollContentPresenter
PreviewMouseLeftButtonDown="ScrollContentPresenter_PreviewMouseLeftButtonDown"
Grid.Column="0"
Grid.Row="0"
Margin="TemplateBinding Control.Padding"
Content="TemplateBinding ContentControl.Content"
ContentTemplate="TemplateBinding ContentControl.ContentTemplate"
CanContentScroll="TemplateBinding ScrollViewer.CanContentScroll" />
<ScrollBar
x:Name="PART_VerticalScrollBar"
Grid.Column="1"
Grid.Row="0"
Minimum="0"
Maximum="TemplateBinding ScrollViewer.ScrollableHeight"
ViewportSize="TemplateBinding ScrollViewer.ViewportHeight"
Value="Binding Path=VerticalOffset, Mode=OneWay, RelativeSource=RelativeSource Mode=TemplatedParent"
Visibility="TemplateBinding ScrollViewer.ComputedVerticalScrollBarVisibility"
Cursor="Arrow" AutomationProperties.AutomationId="VerticalScrollBar" />
<ScrollBar
x:Name="PART_HorizontalScrollBar"
Orientation="Horizontal" Grid.Column="0" Grid.Row="1" Minimum="0"
Maximum="TemplateBinding ScrollViewer.ScrollableWidth" ViewportSize="TemplateBinding ScrollViewer.ViewportWidth" Value="Binding Path=HorizontalOffset, Mode=OneWay, RelativeSource=RelativeSource Mode=TemplatedParent" Visibility="TemplateBinding ScrollViewer.ComputedHorizontalScrollBarVisibility" Cursor="Arrow" AutomationProperties.AutomationId="HorizontalScrollBar" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然后在 DocumentViewer 的 ControlTemplate 中用它覆盖 ScrollViewer 的样式:
<Style
x:Key="MyDVStyleExtend"
BasedOn="StaticResource x:Type DocumentViewer"
TargetType="x:Type DocumentViewer">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DocumentViewer">
<Border BorderThickness="2,2,2,2"
BorderBrush="SlateBlue" Focusable="False">
<Grid Background="StaticResource GridBackground"
KeyboardNavigation.TabNavigation="Local">
<Grid.ColumnDefinitions>
<ColumnDefinition Width ="*"/>
</Grid.ColumnDefinitions>
<ScrollViewer Style="StaticResource CustomScrollPresenter" Grid.Column ="0"
CanContentScroll="True"
HorizontalScrollBarVisibility="Auto"
x:Name="PART_ContentHost"
IsTabStop="True"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然后为 CustomScrollPresenter 样式中声明的“PreviewMouseLeftButtonDown="ScrollContentPresenter_PreviewMouseLeftButtonDown"”属性创建一个函数。
private void ScrollContentPresenter_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
e.Handled = true;
【讨论】:
这似乎确实禁用了文本选择,但它不允许我使用滚动。【参考方案3】:另一种方法是添加例如停靠面板:
<DockPanel Name="pnlTouchTaker"
VerticalAlignment="Bottom" HorizontalAlignment="Left"
Background="Transparent">
</DockPanel>
位于文档查看器“上方”并将其宽度和高度设置为滚动查看器内容的实际宽度和高度,例如页面加载事件。
如果使用缩放选项并且水平工具栏变得可见,您可能需要添加额外的逻辑。
【讨论】:
【参考方案4】:在 xaml.cs 部分中实现以下代码(DocumentViewerInstance x:您的 DocumentViewer 在您的 xaml 中的名称。)
DocumentViewerInstance.GetType().GetProperty("IsSelectionEnabled", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(DocumentViewerInstance, false, null);
您可以使用IsFocusable=false
或IsHitTestVisible = false
或处理任何预览事件(例如在接受的答案中)来禁用选择,但超链接不起作用!如果您设置 IsSelectionEnabled = false,选择将被禁用,但超链接也将起作用。 (警告!IsSelectionEnabled 设置为 false 后可以更改为 true 值,因此您应该经常检查该值。)
【讨论】:
以上是关于在 DocumentViewer 中禁用文本选择的主要内容,如果未能解决你的问题,请参考以下文章
如何禁用 ctrl+click 在 IE 10 中选择文本?