WPF DocumentViewer启用XPS文档在触摸屏上的滚动 [英] WPF DocumentViewer enable scroll on touch screen for XPS document

查看:129
本文介绍了WPF DocumentViewer启用XPS文档在触摸屏上的滚动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在WPF应用程序的DocumentViewer控件中显示XPS文档时,只允许我在屏幕上移动手指,就不允许您在支持触摸的平板电脑上滚动其内容.

When showing an XPS document in the DocumentViewer control of a WPF application it does not allow you to scroll its content on a touch enabled tablet just my moving your fingers over the screen.

相反,它选择文本.在启用触摸的设备上滚动的唯一方法是使用垂直滚动条.

Instead it selects the text. The only way of scrolling on a touch enabled device is by using the vertical scrollbar.

是否可以通过在内容本身而不是垂直滚动条上移动手指来启用触摸滚动?

Is there a way to enable touch scrolling by moving your fingers on the content itself instead of on the vertical scrollbar?

通过覆盖某些样式,我可以防止选择文本,但仍然不允许我滚动. ( https://stackoverflow.com/a/415155/187650 )

By overriding some styles I could prevent the text selection but it still does not allow me to scroll. ( https://stackoverflow.com/a/415155/187650 )

推荐答案

我遇到了同样的问题,并且提出了解决方案,并且效果很好.

I had the same problem and i made a solution and it works perfectly.

我创建了一个自己的Xps Document类来动态设置URI:

I made an own Xps Document class to set URI dynamically:

public class ManualXpsDocument : XpsDocument
{
    private const string _uriOfDoc= "...\\path.xps";

    public ManualXpsDocument(FileAccess fileAccess) : base(_uriOfDoc, fileAccess)
    {

    }
}

这是窗口(或控件)的xaml部分:

Here is the xaml part of window (or control):

  <Grid.Resources>
        <ObjectDataProvider x:Key="myDataSource" MethodName="GetFixedDocumentSequence"
                            ObjectType="{x:Type manual:ManualXpsDocument}">
            <ObjectDataProvider.ConstructorParameters>
                <io:FileAccess>Read</io:FileAccess>
            </ObjectDataProvider.ConstructorParameters>
        </ObjectDataProvider>
    </Grid.Resources>
    <DocumentViewer  x:Name="Viewer" Document="{Binding Source={StaticResource myDataSource}}">
        <DocumentViewer.Resources>
            <Style TargetType="ToolBar">
                <Setter Property="Visibility" Value="Collapsed" />
            </Style>
            <Style TargetType="{x:Type ContentControl}">
                <Setter Property="Visibility" Value="Collapsed" />
            </Style>
        </DocumentViewer.Resources>
        <DocumentViewer.Style>
            <Style TargetType="{x:Type DocumentViewer}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DocumentViewer}">
                            <controls:CustomScrollViewer x:Name="PART_ContentHost">
                                <controls:CustomScrollViewer.Style>
                                    <Style TargetType="{x:Type ScrollViewer}">
                                        <Setter Property="Focusable" Value="false" />
                                        <Setter Property="IsDeferredScrollingEnabled" Value="True" />
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                                                    <Border BorderBrush="#00000000"
                                                        BorderThickness="0,2,0,0">
                                                        <Grid Background="{TemplateBinding Background}"
                                                             SnapsToDevicePixels="true">
                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="*" />
                                                                <ColumnDefinition Width="Auto" />
                                                            </Grid.ColumnDefinitions>
                                                            <Grid.RowDefinitions>
                                                                <RowDefinition Height="*" />
                                                                <RowDefinition Height="Auto" />
                                                            </Grid.RowDefinitions>

                                                            <ScrollContentPresenter Name="PART_ScrollContentPresenter"
                                                                                        ScrollViewer.IsDeferredScrollingEnabled="True"
                                                                                        KeyboardNavigation.DirectionalNavigation="Local"
                                                                                        CanContentScroll="True" 
                                                                                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />


                                                            <controls:CustomScrollBar Name="PART_VerticalScrollBar"
                                                                                      Style="{DynamicResource ScrollBar}"
                                                                                      Grid.Column="1"
                                                                                      Value="{TemplateBinding VerticalOffset}"
                                                                                      Maximum="{TemplateBinding ScrollableHeight}"
                                                                                      ViewportSize="{TemplateBinding ViewportHeight}"
                                                                                      Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
                                                            <controls:CustomScrollBar Name="PART_HorizontalScrollBar"
                                                                                      Grid.Row="1"
                                                                                      Grid.ColumnSpan="2"
                                                                                      Style="{DynamicResource ScrollBar}"
                                                                                      Orientation="Horizontal"       
                                                                                      Value="{TemplateBinding HorizontalOffset}"
                                                                                      Maximum="{TemplateBinding ScrollableWidth}"
                                                                                      ViewportSize="{TemplateBinding ViewportWidth}"
                                                                                      Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
                                                        </Grid>
                                                    </Border>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </controls:CustomScrollViewer.Style>                                 
                            </controls:CustomScrollViewer>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DocumentViewer.Style>
    </DocumentViewer>

这是Window(或控件)的xaml.cs部分:

Here is The xaml.cs part of Window (or control):

    public ctor()
    {
        InitializeComponent();

        PreviewTouchMove += ScrollingHandler;

    }

    private void ScrollingHandler(object sender, TouchEventArgs e)
    {
        TouchPoint tp = e.GetTouchPoint(Viewer);
        if (tp.Action == TouchAction.Move)
        {
            //_scrollingInt is not necessary but Move procedure of Viewer has const value to scroll and the optimalization is recommended. 
            if (_lastYPosition > tp.Position.Y + _scrollingInt)
            {
                Viewer.MoveDown();
                _lastYPosition = tp.Position.Y;
            }  
            else if (_lastYPosition < tp.Position.Y - _scrollingInt)
            {
                Viewer.MoveUp();
                _lastYPosition = tp.Position.Y;
            }
        }

        // Viewer.IsHitTestVisible = false; this setting can disable the selection too,but if you use this, the hyperlinks won't work too.

        Viewer.GetType().GetProperty("IsSelectionEnabled", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(Viewer, false, null);

        //set false "IsSelectionEnabled" "hidden" property instead of Viewer.IsHitTestVisible = false, because the hyperlinks will work too. 

        e.Handled = true;
    }

ScrollingHandler方法解决了该问题.此过程将滚动文档查看器并禁用选择,但是超链接功能仍然可用.

ScrollingHandler method solve the problem. This procedure do the scrolling of document viewer and disable the selection but the hyperlink function still available.

这篇关于WPF DocumentViewer启用XPS文档在触摸屏上的滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆