在documentviewer中的scrollviewer上的工具提示

时间:2011-04-22 19:10:49

标签: wpf wpf-controls scrollviewer documentviewer xpsdocument

我有一个文档查看器,我在我的wpf项目中使用它来显示xps文档报告,其中有大约600页,效果很好。但是从用户的角度来看,我喜欢在我的滚动查看器上显示当前页码作为工具提示,同时拖动滚动条以查看当前页码。有点像这样的PDF文件 -

Tooltip on scrollviewer

我正在寻找一些如何实现这一点的想法。如果不能显示缩略图图像只是当前页码对我来说就足够了。 documentviewer中是否有针对此功能的内置支持??

感谢您的帮助..

1 个答案:

答案 0 :(得分:1)

我找不到像IsScrolling这样的东西,所以我会像这样接近它:

<Popup Name="docPopup" AllowsTransparency="True" PlacementTarget="{x:Reference docViewer}" Placement="Center">
    <Border Background="Black" CornerRadius="5" Padding="10" BorderBrush="White" BorderThickness="1">
        <TextBlock Foreground="White">
                    <Run Text="{Binding ElementName=docViewer, Path=MasterPageNumber, Mode=OneWay}"/>
                    <Run Text=" / "/>
                    <Run Text="{Binding ElementName=docViewer, Path=PageCount, Mode=OneWay}"/>
        </TextBlock>
    </Border>
</Popup>
<DocumentViewer Name="docViewer" ScrollViewer.ScrollChanged="docViewer_ScrollChanged"/>

滚动文档时应显示弹出窗口,然后在一段时间后淡出。这是在处理程序中完成的:

DoubleAnimationUsingKeyFrames anim;
private void docViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    if (anim == null)
    {
        anim = new DoubleAnimationUsingKeyFrames();
        anim.Duration = (Duration)TimeSpan.FromSeconds(1);
        anim.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0))));
        anim.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5))));
        anim.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1))));
    }

    anim.Completed -= anim_Completed;
    docPopup.Child.BeginAnimation(UIElement.OpacityProperty, null);
    docPopup.Child.Opacity = 1;

    docPopup.IsOpen = true;

    anim.Completed += anim_Completed;
    docPopup.Child.BeginAnimation(UIElement.OpacityProperty, anim);
}

void anim_Completed(object sender, EventArgs e)
{
    docPopup.IsOpen = false;
}

编辑:事件也会在通过鼠标滚轮等完成的滚动中触发。您可以在if (Mouse.LeftButton == MouseButtonState.Pressed)中处理处理程序中的所有内容,但不是100%准确,而是使用MouseWheel滚动左击?