Почему между элементами ItemsControl существуют тонкие волосяные линии (1 пиксель?)?
-
22-07-2019 - |
Вопрос
Когда у меня есть цвета фона на элементах в Элементы управления, и установите поля равными 0, WPF оставляет тонкие линии между элементами, как если бы сантехника оболочки ItemsControl занимала незначительное количество места.Я проверил визуальное дерево с помощью Вынюхивать и все поля установлены равными 0,0,0,0.
Что вызывает эти линии и как я могу их избежать?
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>
Код, Стоящий за:
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; }
}
}
Ответ:
Вот решение, спасибо, Кент:
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Background="#ccc" SnapsToDevicePixels="True">
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
Решение
Возможно, WPF выводит определенный уровень прозрачности, потому что элементы не попадают на точные границы пикселей.Попробуйте поиграть с SnapsToDevicePixels
установите свойство на контейнеры элементов и посмотрите, поможет ли это.
Другие советы
Я обнаружил, что SnapToDevicePixes
не всегда работает и, более того, он недоступен в WINRT.Для меня лучшее решение - просто заполнить пробел между элементами, используя немного отрицательный запас.
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Background="DarkGreen" Margin="0,0,-0.5,-0.5">
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>