2013-07-25 1 views
1

Salut, je souhaite créer une petite application qui permet de naviguer dans le système de fichiers et d'afficher plusieurs documents. Un type de document que je veux montrer, est xps. DocumentViewer se porte bien. En combinaison avec un cadre, le spectateur peut gérer les liens internes (inclus dans les documents xps.). Pour mon application je construis une barre d'outils personnalisée (zoom, page, taille ...), pour avoir une barre d'outils pour chaque type de document. J'ai donc dû supprimer la barre d'outils du documentViewer. Voici le code.WPF DocumentViewer perd son style personnalisé après l'utilisation du lien interne

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

Cela fonctionne très bien, mais après avoir activé un lien dans les xps, la barre d'outils DocumentViewer apparaît à nouveau. Comment éviter cela?

Répondre

1

Le problème est que le service de navigation crée une nouvelle norme DocumentViewer après avoir cliqué sur un lien pour la première fois. Cela se produit même lorsque vous utilisez un composant dérivé de DocumentViewer dans votre code XAML.

Vous pouvez contourner ce problème en réinitialisant manuellement le style dans votre événement de conteneur de navigation LayoutUpdated

XAML

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

code derrière

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

Merci Malvin. Votre solution fera le travail. – Markus

Questions connexes