使用堆栈面板在列表框中向上/向下移动按钮

本文关键字:按钮 移动 堆栈 列表 | 更新日期: 2023-09-27 18:34:36

在我的列表框中,我有一个堆栈面板的行..在每个堆栈面板中都有一个向上移动行和向下移动行按钮...不过我在编码时遇到问题。 这就是我用于向上移动的内容,例如:

            int selectedIndex = ListBoxT10.SelectedIndex;
            if (selectedIndex > 0 && selectedIndex != -1)
            {
                if (ListBoxT10.SelectedItem == null)
                    return;
                var idx = ListBoxT10.SelectedIndex;
                var elem = ListBoxT10.SelectedItem;
                ListBoxT10.Items.RemoveAt(idx);
                ListBoxT10.Items.Insert(idx - 1, elem);
                ListBoxT10.SelectedIndex = idx - 1;
            }

我的问题是找出如何获取按钮所在行的"选定索引"和"选定项目".这可能吗?

使用堆栈面板在列表框中向上/向下移动按钮

简单的答案是获取单击的按钮的父级。该父级应该是您的堆栈面板。

然后,一旦有了堆栈面板,您就可以将该对象馈送到列表框获取索引方法中。一旦你有了索引,它就很容易了。你只需切换搜索的仿冒品并切换阿尔加里特姆。

XAML

<Window x:Class="sptest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox Name="mylb">
        </ListBox>
    </Grid>
</Window>

CS 文件

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        for (int x = 0; x < 10; x++)
        {
            StackPanel sp = new StackPanel();
            Button upbt = new Button();
            Button dwbt = new Button();
            upbt.Click += bt_Click;
            dwbt.Click+= bt_Click;
            upbt.Tag = "up";
            dwbt.Tag = "down";
            upbt.Content = "Up";
            dwbt.Content = "Down";
            sp.Orientation = Orientation.Vertical;
            sp.Children.Add(upbt);
            sp.Children.Add(dwbt);
            mylb.Items.Add(sp);
        }
    }
    void bt_Click(object sender, RoutedEventArgs e)
    {
        Button but = (sender as Button);
        var par = but.Parent;
        string tag = but.Tag.ToString();
        if (par is StackPanel)
        {
            StackPanel sp = (par as StackPanel);
            int index = mylb.Items.IndexOf(sp);
            List<StackPanel> items = new List<StackPanel>();
            foreach (StackPanel item in mylb.Items)
            {
                items.Add(item);
            }
            if (but.Tag == "up")
            {
                if (index != 0)
                {
                    StackPanel temp = items[index - 1];
                    items[index - 1] = items[index];
                    items[index] = temp;
                }
            }
            else
            {
                if (index != items.Count)
                {
                    StackPanel temp = items[index + 1];
                    items[index + 1] = items[index];
                    items[index] = temp;
                }
            }
            mylb.Items.Clear();
            foreach (StackPanel item in items)
            {
                mylb.Items.Add(item);
            }
        }
    }
}

此代码已编译并运行,因此它应该是一个很好的起点。

这是复杂/过时的方法。有不太复杂/更专业的方法,例如数据绑定。

如果你真的想成为精英,请查看到列表框的数据绑定。

基本上,将要发生的事情是创建所有对象并将它们放在可观察的集合中。然后,无需手动清除内容并将其重新添加到列表框中,只需操作集合即可。

简单 WPF 数据列表框到可观察字符串集合

我想你会发现在列表框中移动项目充其量是有问题的。 您会发现使用列表要容易得多<>并将其作为列表框的数据源。 每次列表更改时,都会重新生成列表框。