2010-02-24 11 views
9

Mi código XAML es así:WPF: ¿Cómo puedo eliminar el cuadro de búsqueda en un DocumentViewer?

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

¿Cómo puedo, en XAML o en C#, eliminar el cuadro de búsqueda?

Respuesta

13

Vlad's answer me llevó a ver cómo obtener programáticamente ContentControl que contiene la barra de herramientas de búsqueda. Realmente no quería escribir una plantilla completamente nueva para DocumentViewer; Yo quería cambiar (ocultar) solo un control. Eso redujo el problema a cómo recuperar un control que se aplica a través de una plantilla?.
Esto es lo que me di cuenta:

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. Pero: para hacer que esto funcione sin el "findLogicalNode" y antes de que aparezca la ventana, necesita el código de [Quarkonium response] (http://stackoverflow.com/a/9270218/218873) first: 'dv1.ApplyTemplate(); ' – JYL

4

Puede reemplazar una plantilla de control para ello. Para su referencia: el valor por defecto DocumentViewer 's plantilla de control está aquí: Nombre http://msdn.microsoft.com/en-us/library/aa970452.aspx

del barra de herramientas de búsqueda es PART_FindToolBarHost, por lo que también puede simplemente ceder su Visibility-Collapsed.


Editar:
Como el comentario de @ Martin sugiere, la plantilla de control en MSDN (referenciado anteriormente) no es totalmente correcto. Una mejor forma de extraer una plantilla que se usa en WPF de forma predeterminada sería usar Blend (Editar plantilla de control en el menú contextual, si no me equivoco).

+1

Esta es la solución 'correcta' excepto que hay un error en el que obtendrá el modo de diseño (no correr el tiempo) excepción ' 'Zoom' no es un valor válido para la propiedad 'Command'.' . Consulte http://connect.microsoft.com/VisualStudio/feedback/details/566538/document-viewer-controltemplate para obtener más información. –

+0

@Martin: gracias, he actualizado la respuesta. – Vlad

0

¿Estás seguro de que necesitas un DocumentViewer? Puede usar FlowDocumentScrollViewer en su lugar, o si le gusta la paginación o visualización de múltiples columnas, puede usar FlowDocumentPageViewer.

+0

Quiero un DocumentViewer porque mi objetivo es producir una vista previa de impresión, y el XpsDocument es lo que pagina los gráficos automáticamente. Podría hacer esto con un FDSV y algún otro código personalizado, pero ... Preferiría hacer el flojo. – Cheeso

+0

me tienes preguntando cómo imprimir la vista previa de FlowDocuments ... fwiw, de "Pro WPF en C# 2008" parece que escribes el documento de flujo como un archivo XPS y luego lo vuelves a leer (como un documento fijo) y finalmente mostrarlo en un DocumentViewer ... ¡guau! – RAL

+0

sí, así es como lo hago. Ver http://stackoverflow.com/questions/2322064. – Cheeso

4

Como se señaló Vlad puede reemplazar la plantilla de control. Desafortunadamente, la plantilla de control disponible en MSDN no es la plantilla de control real utilizada por el control DocumentViewer. Aquí está la plantilla correcta modificado para ocultar la barra de búsqueda mediante el establecimiento de Visibility="Collapsed" en PART_FindToolBarHost:

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

Es necesario añadir una referencia a PresentationUI.dll. Este ensamblaje se encuentra en la carpeta %WINDIR%\Microsoft.NET\Framework\v4.0.30319\WPF.

2

el fin de obtener la respuesta de Cheeso a trabajar en el constructor he tenido que añadir:

dv1.ApplyTemplate(); 

lo contrario cc sale nulo. Ver la respuesta here

11

Puede hacer algo similar a Cheeso's answer con un estilo de ContentControl y un disparador para ocultarlo cuando el nombre es PART_FindToolBarHost.

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