Я сделал приложение, которое использует Listview для визуализации прямоугольников в определенных позициях (ROI для анализа изображений). Они получают свои координаты из наблюдаемой коллекции. На Windows 7 все работает, как и ожидалось, но с тем же (двоичным) кодом на Windows 10 добавляется смещение для каждого последующего элемента.
Это минимальный рабочий пример для воспроизведения этого поведения .
Ожидается: все прямоугольники должны отображаться в одной и той же позиции в Win7 и Win10, образуя, таким образом, единый квадрат
Реальность: это правильно отображается в Windows 7, но в Windows 10, Граница в ListViewItem отображается не с 0 Height, а с Height = 4, поэтому прямоугольник каждого элемента отображается в другой позиции. Если задать для параметра Height значение «2», прямоугольники станут невидимыми.
Приложение
using System.Collections.ObjectModel;
using System.Windows;
namespace GraphicListBoxTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public static readonly DependencyProperty dataProperty =
DependencyProperty.Register("data", typeof(ObservableCollection<int>), typeof(MainWindow), new PropertyMetadata(null));
public ObservableCollection<int> data
{
get { return (ObservableCollection<int>)GetValue(dataProperty); }
set { SetValue(dataProperty, value); }
}
public MainWindow()
{
InitializeComponent();
data = new ObservableCollection<int>() { 1, 2, 3, 4 }; //Of course, the date is just fake.
}
}
}
Xaml:
<Window x:Class="GraphicListBoxTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GraphicListBoxTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Background="Black">
<Grid>
<ListView HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent" ItemsSource="{Binding data, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" >
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="BorderThickness" Value="0"/>
<!-- Windows 7: 0, Windows 10:-->
<Setter Property="Height" Value="0"/>
<!-- Windows 7: 0, Windows 10: 4, Setting to 0 under Windows 10 completely hides the rectangles-->
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<!-- Windows 7 RenderingSize:Width,0 Windows 10: 4 -->
<DataTemplate x:Name="DT" >
<Canvas x:Name="Canvas">
<Rectangle Width="100" Height="100" Fill="#88FFFFFF">
<Canvas.Left>100</Canvas.Left>
<Canvas.Top>100</Canvas.Top>
</Rectangle>
</Canvas>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Window>
Как получить такой же рендеринг, как в Windows 7? Поскольку в исходном коде я использую много конвертеров, я не хочу пропускать текущий номер только для того, чтобы исправить это смещение ...
Это нативное приложение, поэтому серверы / браузеры не задействованы , В обеих системах используются одни и те же двоичные файлы.
Обе системы используют. Net 4.7.2, пользовательские проекты не настроены.