使用内部链接后,WPF DocumentViewer将丢失自定义样式

使用内部链接后,WPF DocumentViewer将丢失自定义样式,wpf,xps,documentviewer,Wpf,Xps,Documentviewer,我想构建一个小应用程序,它允许在文件系统中导航并显示多个文档。我想展示的一种文档类型是xps。DocumentViewer做得很好。结合框架,查看器可以处理内部链接(包含在xps文档中)。对于我的应用程序,我构建了一个自定义工具栏(缩放、页面、fitsize…),为每种文档提供一个工具栏。所以我需要删除documentViewer的工具栏。下面是代码 <Style x:Key="{x:Type DocumentViewer}" TargetType="{x:Type Document

我想构建一个小应用程序,它允许在文件系统中导航并显示多个文档。我想展示的一种文档类型是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工具栏再次出现。如何避免这种情况?

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

您可以通过手动重置导航容器的
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;
}
private void OnFrameLayoutUpdated(对象发送方,事件参数e)
{
var viewer=GetFirstChildByType(此);
if(viewer==null)返回;
Style=(Style)FindResource(“DocumentViewerStyle”);
}
私有T GetFirstChildByType(DependencyObject属性),其中T:DependencyObject
{
for(int i=0;i
问题在于导航服务在第一次单击链接后创建了一个新的标准
DocumentViewer
。即使在XAML中使用从
DocumentViewer
派生的组件,也会发生这种情况

您可以通过手动重置导航容器的
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;
}
private void OnFrameLayoutUpdated(对象发送方,事件参数e)
{
var viewer=GetFirstChildByType(此);
if(viewer==null)返回;
Style=(Style)FindResource(“DocumentViewerStyle”);
}
私有T GetFirstChildByType(DependencyObject属性),其中T:DependencyObject
{
for(int i=0;i
谢谢你,马尔文。你的解决方案就行了。谢谢你,马尔文。你的解决方案会成功的。