如何清除Xamarin.WPF中listviewitem的奇怪间距?
以下是Xamarin项目的XAML中的代码:如何清除Xamarin.WPF中listviewitem的奇怪间距?,wpf,xamarin,xamarin.forms,Wpf,Xamarin,Xamarin.forms,以下是Xamarin项目的XAML中的代码: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/20
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="App1.MainPage">
<ListView ItemsSource="{Binding TestList}" SeparatorVisibility="None" HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<ContentView BackgroundColor="Red">
<Label Text="{Binding TestName}"></Label>
</ContentView>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace App1
{
// Learn more about making custom code visible in the Xamarin.Forms previewer
// by visiting https://aka.ms/xamarinforms-previewer
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
this.BindingContext = this;
TestList.Add(new Test() { TestName = "aaa" });
TestList.Add(new Test() { TestName = "bbb" });
TestList.Add(new Test() { TestName = "ccc" });
TestList.Add(new Test() { TestName = "ddd" });
}
public ObservableCollection<Test> TestList { get; set; } = new ObservableCollection<Test>();
public class Test
{
public string TestName { get; set; }
}
}
}
这是Android的屏幕截图,非常适合。下面是WPF中的屏幕截图。每个listviewitem的左侧都有一个奇怪的间距。
如您所见,尽管我在WPF项目的ListView/ListViewItem样式中添加了如此多的margin=“0”和padding=“0”,但它根本不起作用
有什么问题吗?我怎样才能解决这个问题?谢谢。无法100%确定问题的根本原因,但我怀疑这与System.Windows.ListViewItem的样式试图显示Xamarin.Forms.ViewCell的内容以及演示者添加了一些边距有关 我可以通过编辑ListViewItem样式的ContentPresenter来修复它(顺便说一句,删除所有其他边距和填充,以确保它们都不会覆盖此设置):
右侧的间距是否也相同?否,WPF中的右侧非常适合。它只出现在左侧。@Mihailduchev尝试在ContentView
margin=“-6,0,0,0”
,reference上设置负边距。@ColeXia MSFT不,我做了你刚才说的,但它根本不起作用。尽管它现在起作用。然而,我认为这不是解决这个问题的正确方法。
<Application x:Class="App1.WPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:App1.WPF"
StartupUri="MainWindow.xaml">
<Application.Resources>
<Style x:Key="LvItemStyle" TargetType="ListViewItem">
<Setter Property="Margin" Value="0"></Setter>
<Setter Property="Padding" Value="0"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter Margin="0"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="ListView" x:Key="LvStyle">
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Foreground" Value="Transparent"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="ScrollViewer.PanningMode" Value="Both"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="0"></Setter>
<Setter Property="Margin" Value="0"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListView">
<ScrollViewer Focusable="false" Padding="0" Margin="0" Background="Green">
<ItemsPresenter Margin="0"/>
</ScrollViewer>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="true"/>
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
</Application>
using App1.WPF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using Xamarin.Forms.Platform.WPF;
[assembly: ExportRenderer(typeof(Xamarin.Forms.ListView), typeof(MyListView))]
namespace App1.WPF
{
class MyListView : ListViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
foreach (var item in Control.Children)
{
if (item is ListView)
{
var list = item as ListView;
list.Style = App.Current.Resources["LvStyle"] as System.Windows.Style;
list.ItemContainerStyle = App.Current.Resources["LvItemStyle"] as System.Windows.Style;
}
}
}
}
}
<Style x:Key="LvItemStyle" TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter Margin="-5,0,0,0"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>