WPF DocumentViewer теряет собственный стиль после использования внутренней ссылки

Привет хочу создать небольшое приложение, которое позволяет перемещаться по файловой системе и отображает несколько документов. Один тип документа, который я хочу показать, это xps. DocumentViewer работает хорошо. В сочетании с фреймом зритель может обрабатывать внутренние ссылки (включены в документы xps.). Для моего приложения я создаю пользовательскую панель инструментов (масштабирование, страница, подгонка размера...), чтобы иметь одну панель инструментов для каждого вида документа. Поэтому мне нужно было удалить панель инструментов DocumentViewer. Ниже приведен код.

<Style x:Key="{x:Type DocumentViewer}"
   TargetType="{x:Type DocumentViewer}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DocumentViewer}">
                <Border BorderThickness="{TemplateBinding BorderThickness}"
            BorderBrush="{TemplateBinding BorderBrush}"
            Focusable="False">
                    <ScrollViewer 
                      CanContentScroll="true"
                      HorizontalScrollBarVisibility="Auto"
                      x:Name="PART_ContentHost"
                      IsTabStop="true">
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Это работает нормально, но после активации ссылки в xps снова появляется панель инструментов DocumentViewer. Как этого избежать?

1 ответ

Решение

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

Вы можете обойти эту проблему, вручную сбросив стиль в вашем контейнере навигации LayoutUpdated событие

XAML

<Frame LayoutUpdated="OnFrameLayoutUpdated">
    <Frame.Content>
        <DocumentViewer ... />
    </Frame.Content>
</Frame>

Код позади

private void OnFrameLayoutUpdated(object sender, EventArgs e)
{
    var viewer = GetFirstChildByType<DocumentViewer>(this);
    if (viewer == null) return;
    viewer.Style = (Style) FindResource("DocumentViewerStyle");
}

private T GetFirstChildByType<T>(DependencyObject prop) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(prop); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild((prop), i) as DependencyObject;
        if (child == null)
            continue;

        T castedProp = child as T;
        if (castedProp != null)
            return castedProp;

        castedProp = GetFirstChildByType<T>(child);

        if (castedProp != null)
            return castedProp;
    }
    return null;
}
Другие вопросы по тегам