2010-06-20 7 views
7

Tengo un ListView que es algo como esto:WPF ListView tiene un borde de un píxel alrededor del panel de diseño interno. ¿Como me deshago de esto?

<ListView 
    x:Name="SeriesListView" 
    SnapsToDevicePixels="True" 
    ItemsSource="{Binding Items}" 
    BorderBrush="Transparent" BorderThickness="0" 
    Padding="0" Margin="0" 
    VerticalContentAlignment="Top" 
    Background="Purple" 
    LostFocus="ListView_LostFocus" 
    > 

    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <local:LDSeriesPanel 
       SnapsToDevicePixels="True" 
       MaxWidth="{Binding ElementName=itControl,Path=ActualWidth}" 
       VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
       MinHeight="{x:Static local:LDSeriesPanel.MIN_HEIGHT}" 
       MinWidth="{x:Static local:LDSeriesPanel.MIN_WIDTH}" 
       Margin="0" 
       Background="Aquamarine"/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

cuando está vacía, la anchura y la altura del panel personalizado he definido es de 15 x 15. Puedo confirmar estas son las dimensiones reales en tiempo de ejecución . Sin embargo, el ListView tiene dimensiones de 17 x 17 (es decir, un borde de un píxel entre el panel y el ListView).

A partir del panel personalizado y subir el árbol, me sale el siguiente antepasados:

  • ItemsPresenter: 15x15
  • ScrollViewer: 15x15
  • Grid: 15x15
  • ScrollViewer: 15x15
  • Borde: 17x17
  • Lista Vista: 17x17

Si cambio el relleno de ListView a -1, elimina el borde pero causa varios otros problemas.

Espero evitar la repetición de todo ListView. Todo lo demás funciona bien. ¿Hay alguna manera de que pueda eliminar este borde de un píxel, tal vez a través de un estilo?

Respuesta

2

Acabo de echar un vistazo a la plantilla predeterminada para ListView, de hecho, el Border tiene un relleno explícito de 1 ... así que no creo que pueda hacerlo sin redefinir la plantilla. De todos modos, no es muy difícil: simplemente copie la plantilla predeterminada utilizando una herramienta como StyleSnooper o ShowMeTheTemplate (creo que Blend también puede hacerlo), y cambie lo que necesita ...

+0

Grrr .... bien. :( –

+1

Terminé utilizando un ListBox en su lugar, pero le daré la marca de verificación. La competencia fue feroz en esta cuestión ...;) –

8

Es realmente simple, si tiene mezcla puede hacer clic con el botón derecho en la vista de lista y elegir editar la plantilla y eliminar el relleno del borde. Puedes hacer esto directamente en xaml. Como quiero que todas mis vistas de lista no tengan este borde, creo un archivo de recursos llamado MyprojectnameResources.xaml en la raíz del proyecto con este contenido.

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<ControlTemplate x:Key="ListViewNewTemplate" TargetType="{x:Type ListBox}"> 
    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="0" SnapsToDevicePixels="True"> 
     <ScrollViewer Focusable="False" Padding="{TemplateBinding Padding}"> 
      <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </ScrollViewer> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
     </Trigger> 
     <Trigger Property="IsGrouping" Value="True"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="False"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
<!-- Resource dictionary entries should be defined here. --> 

A continuación, puede utilizar esta plantilla con cualquier vista de lista que desea

<ListView Width="1020" Height="764" ItemsSource="{Binding Destinations}" ItemTemplate="{DynamicResource DestinationDataTemplate}" Canvas.Top="0" Canvas.Left="0" BorderThickness="0" Template="{DynamicResource ListViewNewTemplate}" /> 
+0

Fue el tonto Padding = "1" en el borde. Cambiarlo a Padding = "0" fue la solución. – DaleyKD

5

Una solución rápida y sucia (énfasis en la "sucia"):

<ListView Padding="-1" /> 
+0

¡Gracias por esto! Funciona perfectamente en WinRT. –

3

La solución más simple para mí fue establecer el grosor del borde a 0, como:

<ListBox BorderThickness="0" /> 

No hay plantillas requeridas ...

Cuestiones relacionadas