1

您好想构建一个小型应用程序,允许浏览文件系统并显示多个文档。我想展示的一种文档是 xps。DocumentViewer 做得很好。结合框架,查看器可以处理内部链接(包含在 xps 文档中。)。对于我的应用程序,我构建了一个自定义工具栏(缩放、页面、fitsize ...),为每种文档提供一个工具栏。所以我需要删除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 工具栏再次出现。如何避免这种情况?

4

1 回答 1

1

问题是导航服务DocumentViewer在第一次单击链接后创建了一个新标准。即使您使用从DocumentViewerXAML 中派生的组件,也会发生这种情况。

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;
}
于 2013-09-18T10:44:04.387 回答