Подсказка для прокрутки в окне просмотра документов - PullRequest
1 голос
/ 22 апреля 2011

У меня есть средство просмотра документов, которое я использовал в своем проекте wpf, чтобы показать отчеты по документам в формате xps, содержащие около 600 страниц, что прекрасно работает. Но с точки зрения пользователя, я хотел бы показать номер текущей страницы в виде всплывающей подсказки на моем скроллвере при перетаскивании прокрутки с указанием текущего номера страницы. Примерно как в файле PDF, как это -

Tooltip on scrollviewer

Я искал идеи, как это реализовать. Просто номер текущей страницы, если невозможно отобразить уменьшенное изображение, было бы достаточно для меня. Есть ли встроенная поддержка в просмотрщике документов для этой функции ??

Спасибо за любую помощь ..

1 Ответ

1 голос
/ 23 апреля 2011

Я не могу найти ничего похожего на 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% точно, но кто прокручивает с помощью колеса мыши при щелчке левой кнопкой мыши

...