Подсказка по просмотру прокрутки в просмотрщике документов

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

Подсказка в средстве просмотра прокрутки

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

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


person Rohit Vats    schedule 22.04.2011    source источник


Ответы (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% точно, но кто прокручивает с помощью колесика мыши, щелкая левой кнопкой мыши?

person H.B.    schedule 22.04.2011
comment
Это что-то новое для меня, я никогда так много не играл с PopUp. Обязательно попробую. - person Rohit Vats; 23.04.2011
comment
Это отлично работает, у меня есть один запрос, который я разместил здесь - stackoverflow.com/questions/5831514/ относится только к этому. Не могли бы вы помочь мне с этим тоже??? - person Rohit Vats; 29.04.2011