2010-02-24 10 views
9

Mein XAML-Code ist wie folgt aus:WPF: Wie kann ich die Suchbox in einem DocumentViewer entfernen?

<Window 
    xmlns     ='http://schemas.microsoft.com/netfx/2007/xaml/presentation' 
    xmlns:x    ='http://schemas.microsoft.com/winfx/2006/xaml' 
    Title     ='Print Preview - More stuff here' 
    Height    ='200' 
    Width     ='300' 
    WindowStartupLocation ='CenterOwner'> 
    <DocumentViewer Name='dv1' ... /> 
</Window> 

Wie kann ich in XAML oder in C#, die Box Suche beseitigen?

Antwort

13

Vlad's answer führte mich zu untersuchen, wie programmgesteuert greifen Sie auf das ContentControl, das die Suchleiste enthält. Ich wollte eigentlich keine komplett neue Vorlage für den DocumentViewer schreiben; Ich wollte nur eine Kontrolle ändern (verstecken). Das reduzierte das Problem auf , wie ein Steuerelement abgerufen wird, das über eine Vorlage angewandt wird?.
Hier ist, was ich herausgefunden:

Window window = ... ; 
    DocumentViewer dv1 = LogicalTreeHelper.FindLogicalNode(window, "dv1") as DocumentViewer; 
    ContentControl cc = dv1.Template.FindName("PART_FindToolBarHost", dv1) as ContentControl; 
    cc.Visibility = Visibility.Collapsed; 
+4

+1. Aber: Damit dies ohne "findLogicalNode" funktioniert und bevor das Fenster angezeigt wird, benötigt es zuerst den Code von [Quarkonium response] (http://stackoverflow.com/a/9270218/218873): 'dv1.ApplyTemplate(); ' – JYL

4

Sie können eine Kontrollvorlage dafür ersetzen. Zu Ihrer Information: Die Standard-DocumentViewer ‚s Steuervorlage ist hier: http://msdn.microsoft.com/en-us/library/aa970452.aspx

Der Name der Suchleiste ist PART_FindToolBarHost, so können Sie auch die nur Visibility-Collapsed zuweisen.


Edit:
Wie der Kommentar von @ Martin schlägt vor, die Steuervorlage in MSDN (oben zitiert) ist nicht ganz korrekt. Eine bessere Möglichkeit, eine Vorlage zu extrahieren, die in WPF standardmäßig verwendet wird, wäre die Verwendung von "Blend" (im Kontextmenü Kontextsteuervorlage bearbeiten, wenn ich mich nicht irre).

+1

Dies ist die ‚richtige‘ Lösung außer es ist ein Fehler ist, wo Sie den Entwurfsmodus Ausnahme erhält (nicht Laufzeit) '‚Zoom‘ist kein gültiger Wert für Eigenschaft‚Command'.' . Weitere Informationen finden Sie unter http://connect.microsoft.com/VisualStudio/feedback/details/566538/document-viewer-controltemplate. –

+0

@Martin: Danke, ich habe die Antwort aktualisiert. – Vlad

0

Sind Sie sicher, dass Sie einen DocumentViewer brauchen? Sie könnten stattdessen einen FlowDocumentScrollViewer verwenden, oder wenn Sie Paginierung oder mehrspaltige Anzeige möchten, können Sie einen FlowDocumentPageViewer verwenden.

+0

Ich möchte einen DocumentViewer, weil mein Ziel ist, Druckvorschau zu erzeugen, und das XpsDocument ist die Sache, die Visualisierungen automatisch paginiert. Ich könnte das mit einem FDSV und einem anderen benutzerdefinierten Code machen, aber ... Ich würde lieber das faule Ding machen. – Cheeso

+0

Sie haben mich gefragt, wie Sie drucken Vorschau für FlowDocuments ... fwiw, von "Pro WPF in C# 2008" sieht aus wie Sie schreiben die Flow-Dokument als XPS-Datei dann wieder eingelesen (als festes Dokument) und schließlich zeige es in einem DocumentViewer an ... wow! – RAL

+0

Ja, so mache ich es. Siehe http://stackoverflow.com/questions/2322064. – Cheeso

4

Als Vlad wies darauf hin, Sie die Steuervorlage ersetzen kann. Leider ist die Steuerelementvorlage, die in MSDN verfügbar ist, nicht die echte Steuerelementvorlage, die von dem Steuerelement DocumentViewer verwandt wird. Hier ist die richtige Vorlage modifiziert, um die Suchleiste ausblenden, indem Visibility="Collapsed" auf PART_FindToolBarHost Einstellung:

<!-- DocumentViewer style with hidden search bar. --> 
<Style TargetType="{x:Type DocumentViewer}" xmlns:Documents="clr-namespace:System.Windows.Documents;assembly=PresentationUI"> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> 
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
    <Setter Property="ContextMenu" Value="{DynamicResource {ComponentResourceKey ResourceId=PUIDocumentViewerContextMenu, TypeInTargetAssembly={x:Type Documents:PresentationUIStyleResources}}}"/> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type DocumentViewer}"> 
     <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Focusable="False"> 
      <Grid Background="{TemplateBinding Background}" KeyboardNavigation.TabNavigation="Local"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <ContentControl Grid.Column="0" Focusable="{TemplateBinding Focusable}" Grid.Row="0" Style="{DynamicResource {ComponentResourceKey ResourceId=PUIDocumentViewerToolBarStyleKey, TypeInTargetAssembly={x:Type Documents:PresentationUIStyleResources}}}" TabIndex="0"/> 
      <ScrollViewer x:Name="PART_ContentHost" CanContentScroll="true" Grid.Column="0" Focusable="{TemplateBinding Focusable}" HorizontalScrollBarVisibility="Auto" IsTabStop="true" Grid.Row="1" TabIndex="1"/> 
      <DockPanel Grid.Row="1"> 
       <FrameworkElement DockPanel.Dock="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"/> 
       <Rectangle Height="10" Visibility="Visible" VerticalAlignment="top"> 
       <Rectangle.Fill> 
        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0"> 
        <LinearGradientBrush.GradientStops> 
         <GradientStopCollection> 
         <GradientStop Color="#66000000" Offset="0"/> 
         <GradientStop Color="Transparent" Offset="1"/> 
         </GradientStopCollection> 
        </LinearGradientBrush.GradientStops> 
        </LinearGradientBrush> 
       </Rectangle.Fill> 
       </Rectangle> 
      </DockPanel> 
      <ContentControl x:Name="PART_FindToolBarHost" Grid.Column="0" Focusable="{TemplateBinding Focusable}" Grid.Row="2" TabIndex="2" Visibility="Collapsed"/> 
      </Grid> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Sie müssen einen Verweis auf PresentationUI.dll hinzuzufügen. Diese Baugruppe befindet sich im Ordner %WINDIR%\Microsoft.NET\Framework\v4.0.30319\WPF.

2

Um Cheeso Antwort auf Arbeit in den Konstruktor zu bekommen ich hinzufügen musste:

dv1.ApplyTemplate(); 

sonst cc Null herauskommt. Siehe Antwort here

11

Sie etwas Ähnliches wie Cheeso's answer mit einem Stil tun für ContentControl und einen Auslöser, um es auszublenden, wenn der Name PART_FindToolBarHost ist.

<DocumentViewer> 
    <DocumentViewer.Resources> 
    <Style TargetType="ContentControl"> 
     <Style.Triggers> 
     <Trigger Property="Name" Value="PART_FindToolBarHost"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </DocumentViewer.Resources> 
</DocumentViewer> 
1
<DocumentViewer> 
    <DocumentViewer.Resources> 
     <!-- Toolbar -->   
     <Style TargetType="ToolBar"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </Style> 
      <!-- Search --> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </Style> 
    </DocumentViewer.Resources> 
</DocumentViewer>