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;
}