Windows 7 和 Windows 10 之间的 ListViewItem 有什么区别
What are the differences in ListViewItem between Windows 7 and Windows 10
我制作了一个应用程序,它使用 Listview 在特定位置呈现矩形(用于图像分析的 ROI)。这些从可观察的集合中获取坐标。在 Windows 7 上,一切都按预期工作,但 运行 在 Windows 10 上使用相同的(二进制)代码,为每个连续的项目添加一个偏移量。
这是重现此行为的最小工作示例。
预期:所有的矩形在Win7和Win10中都应该渲染在同一个位置,从而形成一个统一的正方形
现实:这在 Windows 7 中正确呈现,但在 Windows 10 中,ListViewItem 中的边框不是以 0 高度呈现,而是以高度 = 4 呈现,因此矩形来自每个项目都呈现在不同的位置。将高度显式设置为小于 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,没有设置自定义设计。
好的,是时候自己回答了:由于不可能将 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>
我制作了一个应用程序,它使用 Listview 在特定位置呈现矩形(用于图像分析的 ROI)。这些从可观察的集合中获取坐标。在 Windows 7 上,一切都按预期工作,但 运行 在 Windows 10 上使用相同的(二进制)代码,为每个连续的项目添加一个偏移量。
这是重现此行为的最小工作示例。
预期:所有的矩形在Win7和Win10中都应该渲染在同一个位置,从而形成一个统一的正方形
现实:这在 Windows 7 中正确呈现,但在 Windows 10 中,ListViewItem 中的边框不是以 0 高度呈现,而是以高度 = 4 呈现,因此矩形来自每个项目都呈现在不同的位置。将高度显式设置为小于 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,没有设置自定义设计。
好的,是时候自己回答了:由于不可能将 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>