2015-04-08 3 views
0

В WPF у меня есть DocumentViewer внутри элемента управления Frame. DocumentViewer показывает документ XPS, сгенерированный с помощью MS Word. Документ содержит таблицу содержимого, чтобы помочь перемещаться по документу.WPF DocumentViewer: перемещаться по внутренней ссылке неточно при первом нажатии

DocumentViewer позволяет пользователю щелкнуть эти ссылки и перейти к соответствующим страницам, если DocumentViewer помещен в элемент управления, который позволяет осуществлять навигацию (например, Frame).

Когда пользователь переходит в первый раз, DocumentViewer не переходит точно в связанное местоположение. Чем дальше в документе, тем больше становится пространство между местом прыжка и фактическим местоположением. Похоже, что он отключен на определенную сумму за страницу. После этой первой ссылки нажмите, навигация работает отлично.

При навигации с помощью кнопок навигации на кадре точность привязки ведет себя снова, как только загрузится самое первое представление.

По сообщению this, после первого щелчка по ссылке создается новый DocumentViewer. Кажется, что это создает экземпляр, который работает так, как ожидалось.

Почему первоначальный экземпляр не точно выполняет навигацию и как это решить?

Ниже приведенный ниже код может быть использован для воспроизведения проблемы.

XAML внутри окна: за

<Frame> 
    <Frame.Content> 
     <DocumentViewer Name="docViewer" /> 
    </Frame.Content> 
</Frame> 

Код:

public MainWindow() 
    { 
     InitializeComponent(); 
     LoadDoc(); 
    } 

    private void LoadDoc() 
    { 
     XpsDocument xpsDoc = new XpsDocument("test.xps", FileAccess.Read); 
     docViewer.Document = xpsDoc.GetFixedDocumentSequence(); 
    } 

test.xps документ содержит оглавление и две главы с около 40 страниц между ними. Проблема становится понятной при навигации по второй главе (она отключена на 3 страницы).

+0

ли вы когда-нибудь найти решение этой проблемы ? Я столкнулся с тем же делом –

+0

@ Dave_750 Привет, Дейв, нет, к сожалению нет. Это еще одна проблема в нашем продукте: ( – Chris

+0

Спасибо за то, что я вернулся. Я тоже ничего не нашел. Если это помогает, я отобразил xps в управлении веб-браузером, и он отлично работает, за исключением того, что я должен ждать 5 секунд чтобы он полностью загрузился или он все еще прыгает в неправильное место. Мне также пришлось добавить пустую страницу в конец. Styling был PITA тоже ... –

ответ

1

Спустя почти два года я пересмотрел эту проблему и нашел решение.

Как видно из моего первоначального сообщения, я использовал Frame со своим содержанием, установленным на DocumentViewer. Frame используется для навигации по документу XPS.

Некоторые детали:

При загрузке документа в первый раз, фактический Content из Frame устанавливается в DocumentViewer. SourceFrame - null. При нажатии ссылки в документе Frame переходит к местоположению, но имеет низкую точность, как описано в моем вопросе выше. За кулисами Frame изменил свой Content на экземпляр FixedDocumentSequence, а его Source настроен на щелчок Uri. С этого момента навигация работает совершенно точно.

Решение:

Решение на самом деле очень просто.Вместо того, чтобы положить DocumentViewer внутри Frame и установить свойство DocumentViewer.Document фактическому FixedDocumentSequence, свойство Frame.Source должно быть установлено на UriFixedDocumentSequence.

FixedDocumentSequence реализует явное свойство интерфейса IUriContext.BaseUri, которое может использоваться для извлечения Uri.

В моем коде, я использую привязки, чтобы установить источник:

<UserControl x:Class="XPSDocumentView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:base="clr-namespace:System.Windows.Markup;assembly=System.Xaml" > 

    <Grid> 
     <Frame Margin="5" NavigationUIVisibility="Hidden" 
       Source="{Binding Path=Document.(base:IUriContext.BaseUri)}" /> 
    </Grid> 

</UserControl> 

В коде позади вы могли бы сделать то же самое, делая это:

XpsDocument xpsDoc = new XpsDocument(Path, FileAccess.Read); 
FixedDocumentSequence document = xpsDoc.GetFixedDocumentSequence(); 
frame.Source = ((System.Windows.Markup.IUriContext)document).BaseUri; 
Смежные вопросы