DocumentViewerの中でテキストの選択を無効にします
-
21-08-2019 - |
質問
素朴な疑問。どのようにWPFのDocumentViewerののテキストの選択を無効にするには?これは、XPSドキュメントがビューアで表示され、その後、テキストはマウスで強調表示することが可能な機能です。強調表示されたテキストもコピーすることができますが、私はすでにこれを無効にしています。私はハイライトを無効にする方法がわからない。
ありがとうございます。
解決
私たちは、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;
}
他のヒント
もう一つの方法は、例えば追加することですdockpanelます:
<DockPanel Name="pnlTouchTaker"
VerticalAlignment="Bottom" HorizontalAlignment="Left"
Background="Transparent">
</DockPanel>
例えばにおけるScrollViewerのコンテンツの実際の幅と高さを「上」DocumentViewerのセットit's幅と高さを横たわっページロードイベントます。
あなたは、ズームオプションを使用している場合、追加のロジックを追加する必要があるかもしれませんし、水平方向のツールバーが見えるようになります。
あなたはIsFocusable = falseを使用することができます。しかし、検索ボックスがあまりにも無効になります...
xaml.cs部分に次のコードを実装(DocumentViewerInstance X:あなたのXAMLであなたのDocumentViewerの名を)
DocumentViewerInstance.GetType().GetProperty("IsSelectionEnabled", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(DocumentViewerInstance, false, null);
あなたはIsFocusable=false
またはIsHitTestVisible = false
を使用するか、または無効に選択するために(受け入れ答えに例えば)任意のプレビューイベントを処理するが、ハイパーリンクは動作しませんすることができます!あなたはIsSelectionEnabled = falseを設定すると、選択が無効になりますが、ハイパーリンクは、あまりにも動作します。 (警告!あなたはfalseを設定した後IsSelectionEnabledが真の値を変更することができますので、あなたは、多くの場合、値をチェックする必要があります。)