首页 > 解决方案 > 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;
}

标签: c#sortinguwpscrollviewerwindows-iot-core-10

解决方案


最好和最实用的解决方案是重写代码以不使用直接控件操作,而是使用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是自定义控件的类型。


推荐阅读