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