2009-08-05 4 views
2

Lorsque j'ai des couleurs d'arrière-plan sur les éléments d'un ItemsControl et que vous définissez les marges sur 0, WPF laisse les lignes haies entre les éléments comme si la plomberie d'emballage ItemsControl occupait une petite quantité d'espace. J'ai vérifié l'arbre visuel avec Snoop et toutes les marges sont définies à 0,0,0,0.Pourquoi y a-t-il de fines lignes haies (1 pixel?) Entre les éléments ItemsControl?

Quelles sont les causes de ces lignes et comment puis-je les éviter?

alt text http://i32.tinypic.com/9tzh1d.png

XAML:

<DockPanel> 

    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Background="Yellow" > 
     <ItemsControl ItemsSource="{Binding CustomerList}"> 

      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Background="DarkGreen"> 
         <TextBlock Text="{Binding LastName}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 

      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <DockPanel Margin="10"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 

     </ItemsControl> 
    </StackPanel> 

</DockPanel> 

code-behind:

using System.Windows; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 
namespace TestItemsControl2938 
{ 
    public partial class Window1 : Window, INotifyPropertyChanged 
    { 
     private ObservableCollection<Customer> _customerList = new ObservableCollection<Customer>(); 
     public ObservableCollection<Customer> CustomerList 
     { 
      get 
      { 
       return _customerList; 
      } 

      set 
      { 
       _customerList = value; 
       OnPropertyChanged("CustomerList"); 
      } 
     } 

     public Window1() 
     { 
      InitializeComponent(); 
      DataContext = this; 

      CustomerList.Add(new Customer { FirstName = "Jim", LastName = "Jones" }); 
      CustomerList.Add(new Customer { FirstName = "Joe", LastName = "Adams" }); 
      CustomerList.Add(new Customer { FirstName = "Jake", LastName = "Johnson" }); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    public class Customer 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Street { get; set; } 
     public string Location { get; set; } 
     public string ZipCode { get; set; } 
    } 

} 

Réponse:

est ici le correctif, grâce Kent:

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Background="#ccc" SnapsToDevicePixels="True"> 
      <TextBlock Text="{Binding LastName}"/> 
     </StackPanel> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

Répondre

9

Il peut être WPF inférant une certaine quantité de transparence parce que les éléments ne tombent pas sur les limites des pixels exactes. Essayez de jouer avec la propriété SnapsToDevicePixels sur les conteneurs d'objets et voyez si cela aide.

+0

Grâce à cela, j'ai posté le code en utilisant SnapsToDevicePixels ci-dessus. –

+0

Merci, cela peut être difficile. Je ne peux pas compter le nombre de fois que j'ai creusé dans un gabarit à la recherche de marge cachée. Il serait bon de se rappeler de vérifier cela en premier. – kbo4sho88

0

J'ai trouvé que SnapToDevicePixes ne fonctionne pas toujours et de plus, il n'est pas disponible sous WINRT. Pour moi, la meilleure solution est simplement de combler l'écart entre les éléments en utilisant une marge légèrement négative.

    <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Background="DarkGreen" Margin="0,0,-0.5,-0.5"> 
          <TextBlock Text="{Binding LastName}"/> 
         </StackPanel> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
Questions connexes