Каковы различия в ListViewItem между Windows 7 и Windows 10 - PullRequest
0 голосов
/ 30 января 2020

Я сделал приложение, которое использует 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, пользовательские проекты не настроены.

1 Ответ

1 голос
/ 03 февраля 2020

ОК, самое время ответить самому: поскольку невозможно установить Height в 0, не пропуская все, я попробовал другие возможности.

При установке Height в 10 и от Margin до 0, -10,0,0 рендеринг правильный. То есть движок рендеринга предполагает, что вы не можете перейти ниже нуля? Я думаю, что это странно, но, по крайней мере, работает для меня.

Это стиль, который я сейчас использую:

    <Style x:Key="FixWindows10Offset"  TargetType="{x:Type ListViewItem}">
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Height" Value="10"/>
        <Setter Property="Margin" Value="0,-10,0,0"/>
    </Style>
...