gpt4 book ai didi

c# - 在 ViewCell 中共享网格列的宽度?

转载 作者:行者123 更新时间:2023-11-30 23:27:18 25 4
gpt4 key购买 nike

我希望我的 ListViews ViewCell 中的列都具有相同的大小。它目前设置为自动,最宽的名称应该获胜,所有其他列应该设置为最宽的标签宽度。目前它们每一行的宽度都不同。

ListView ItemTemplate 示例:

<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> /
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<Label Grid.Row="0" Text="{Binding Name}"/>
[....]

在 WPF 中我们有属性 SharedSizeGroup,在 Xamarin.Forms 中有类似的东西吗?有没有无需过多破解的解决方法?

最佳答案

很遗憾,没有 - 没有这样的属性。

这是一件相当困难的事情,因为您需要先测量所有行,然后才能找出哪一行的文本最宽。没有跨平台的方法来做到这一点。在 Android 和 iOS 的平台级别有很多方法可以做到这一点,但我认为 WinPhone 没有办法。

[编辑以反射(reflect)评论中确定的更好方法]:

另一种方法是使用 OneWayToSource 绑定(bind)并跟踪每个 ListView 行的 ColumnDefinition 条目。

XamlPage.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"
x:Class="FormsSandbox.XamlPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness" iOS="0,20,0,0" Android="0" WinPhone="0"/>
</ContentPage.Padding>

<AbsoluteLayout>
<ListView x:Name="MyLV" AbsoluteLayout.LayoutBounds="0,0,1,1" AbsoluteLayout.LayoutFlags="All">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid RowSpacing="0" ColumnSpacing="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Text="{Binding .}" MinimumWidthRequest="50" HorizontalOptions="StartAndExpand" SizeChanged="LabelSizeChanged" />
<Label Grid.Column="1" Text="Second Column"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</AbsoluteLayout>

</ContentPage>

XamlPage.xaml.cs:

using System;
using Xamarin.Forms;
using System.Collections.Generic;

namespace FormsSandbox
{
public partial class XamlPage : ContentPage
{
private double _colSize = 0.0;
private List<ColumnDefinition> _columns = new List<ColumnDefinition>();

public XamlPage ()
{
InitializeComponent ();

var data = new List<string> ();

data.Add ("Lorem ipsum");
data.Add ("Foo");
data.Add ("Dolor semet");
data.Add ("Test");
data.Add (".");
data.Add ("Xamarin Forms Is Great");
data.Add ("Short");
data.Add ("Longer than Short");
data.Add ("");
data.Add ("Hyphenated");
data.Add ("Non-hyphenated");
data.Add ("Ironic, eh?");

MyLV.ItemsSource = data;
}

public void LabelSizeChanged (object sender, EventArgs e)
{
var label = (Label)sender;
var grid = (Grid)label.Parent;
var column = grid.ColumnDefinitions [0];
if (!_columns.Contains (column)) {
_columns.Add (column);
}
var adjustments = new List<ColumnDefinition> ();
if (label.Width > _colSize) {
_colSize = label.Width;
adjustments.AddRange (_columns);
} else {
adjustments.Add (column);
}
foreach (var col in adjustments) {
col.Width = new GridLength (_colSize);
}
}
}
}

Screenshot of current solution

关于c# - 在 ViewCell 中共享网格列的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com