c# - UWP C# 在 ScrollViewer 中对项目进行排序
问题描述
我在我的scrollviewer
. 但是,这些项目不是按顺序添加的。添加它们后,我想按升序对它们进行排序。我已经检查了这个线程 - UWP/C#: ObservableCollection sort in-place (w/o scrolling),但它在 a上的listview
工作方式对我不起作用。有什么方法可以对我有利吗?
谢谢你。
我创建了一个UserControl
要在Add
单击、编辑和保存按钮时添加的内容。
<TextBlock Text="Card" FontSize="12" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="5,0,0,0" />
<TextBlock x:Name="CardAddress" Text="-" FontSize="10" Height="30" Width="40" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="12,18,0,0" />
<TextBlock x:Name="ZoneNameA" Text="Zone A" FontSize="10" TextWrapping="Wrap" Height="30" Width="80" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="50,0,0,0"/>
<TextBlock x:Name="ZoneNameB" Text="Zone B" FontSize="10" TextWrapping="Wrap" Height="30" Width="80" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="140,0,0,0"/>
<TextBlock x:Name="ZoneNameC" Text="Zone C" FontSize="10" TextWrapping="Wrap" Height="30" Width="80" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="230,0,0,0"/>
<TextBlock x:Name="ZoneNameD" Text="Zone D" FontSize="10" TextWrapping="Wrap" Height="30" Width="80" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="320,0,0,0"/>
<AppBarButton x:Name="EditZoneName" Icon="Edit" Height="40" Width="40" VerticalAlignment="Center" HorizontalAlignment="Right" Visibility="Visible" Click="EditZoneName_Click"/>
<AppBarButton x:Name="DeleteZoneName" Icon="Delete" Height="40" Width="40" VerticalAlignment="Center" HorizontalAlignment="Right" Visibility="Collapsed" Click="DeleteZoneName_Click"/>
代码隐藏:
internal void setZoneName(string zoneA, string zoneB, string zoneC, string zoneD, string cardaddress)
{
if (cardaddress.Equals("")) cardaddress = "1";
if (zoneA.Equals("")) zoneA = "Zone A";
if (zoneB.Equals("")) zoneB = "Zone B";
if (zoneC.Equals("")) zoneC = "Zone C";
if (zoneD.Equals("")) zoneD = "Zone D";
zone.setZoneName(zoneA, zoneB, zoneC, zoneD, cardaddress);
updateDisplay();
}
internal void updateDisplay()
{
CardAddress.Text = zone.cardAddress;
ZoneNameA.Text = zone.ZoneAlabel;
ZoneNameB.Text = zone.ZoneBlabel;
ZoneNameC.Text = zone.ZoneClabel;
ZoneNameD.Text = zone.ZoneDlabel;
}
当我单击Add
并“保存”时,详细信息想了解如何sort
按升序排列项目。
private void AddZoneCard_Click(object sender, RoutedEventArgs e)
{
ZonesUserControl zoneControl = new ZonesUserControl(this, new Zone());
Zone24_Panel.Children.Add(zoneControl);
ZoneNameUserControl zoneName = new ZoneNameUserControl(this, new Zone());
ZoneName_Panel.Children.Add(zoneName);
}
private async void SaveZoneCard_Click(object sender, RoutedEventArgs e)
{
zoneSaved = true;
editZoneName = false;
foreach (ZoneNameUserControl u in ZoneName_Panel.Children)
{
if (u.currentState == ZoneNameUserControl.State.EDIT)
{
u.currentState = ZoneNameUserControl.State.IDLE;
var zoneAname = ZoneAName.Text;
var zoneBname = ZoneBName.Text;
var zoneCname = ZoneCName.Text;
var zoneDname = ZoneDName.Text;
var cardadr = CardAddress.Text;
u.setZoneName(zoneAname, zoneBname, zoneCname, zoneDname, cardadr);
}
//u.updateDisplayName();
await saveZoneNameToJSON(getZoneName());
}
foreach (ZonesUserControl u in Zone24_Panel.Children)
{
u.updateZoneLabel();
}
CardAddress.IsEnabled = false;
ZoneAName.IsEnabled = false;
ZoneBName.IsEnabled = false;
ZoneCName.IsEnabled = false;
ZoneDName.IsEnabled = false;
}
解决方案
最好和最实用的解决方案是重写代码以不使用直接控件操作,而是使用ListView
或其他列表控件并DataTemplate
改为使用。这有很多好处,包括虚拟化、一致性、更好的可维护性和更好的整体性能。请查看文档以获取有关如何实施这些控制(包括数据绑定)的更多详细信息。
如果你坚持手动创建控件,那还是可以的,但不是很方便。首先,您应该在自定义控件代码隐藏中公开要排序的属性。假设你想按一些Number
属性排序:
public int Number { get; private set; }
从构造函数或自定义控件代码初始化属性。然后,要进行排序,您需要实际从可视化树中分离控件并按排序顺序重新附加它们(或者使用该Move
方法移动它们,但这可能会导致不必要的复杂代码)。
var controls = Container.Children.OfType<CustomControl>().OrderBy(c=>c.Number).ToArray();
Container.Children.Clear();
foreach (var control in controls)
{
Container.Children.Add(control);
}
其中Container
是控件存储为子控件的面板类型,并且CustomControl
是自定义控件的类型。
推荐阅读
- javascript - 在子模块内部使用父模块中的组件
- pdf - 从 PDF 生成条形码
- javascript - Javascript中函数变量的范围:通过背景颜色循环
- laravel - 通过 Redis 在多个服务器上的 Laravel 事件监听器
- excel-dna - 如何获取数组函数中每个单元格的单元格地址?
- websocket - 我们是否必须为 Signalr 使用 Websocket Sampler。这是 JMeter 中的义务还是建议?
- google-cloud-platform - GCP 悉尼地区的 Cloud Task 连接速度非常慢
- c# - 成瘾问题
- python - 仅使用 glob 搜索多个模式一次
- java - JPA 更新对象在多对多关系中创建一个新对象