在我的列表框中,我有一堆堆栈面板..并且在每个堆栈面板中都是向上移动行并向下移动行按钮...我在编码时遇到了麻烦。这就是我举起来的例子:
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;
}
我的问题是找出如何获取按钮所在行的“选定索引”和选定项目..这可能吗?
答案 0 :(得分:1)
简单的答案是获取单击按钮的父级。那个父母应该是你的堆栈面板。
然后,一旦有了堆栈面板,就可以将该对象输入到列表框中获取索引方法。一旦你有索引它很容易。你只需转动搜索和切换algarithm。
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);
}
}
}
}
此代码已编译并运行,因此它应该是一个很好的起点。
这是复杂/豁免的方式。有一些不那么复杂/更专业的方法,比如数据绑定。
如果您真的想成为精英,请查看数据绑定到列表框。
基本上会发生什么是创建所有对象并将它们放在可观察的集合中。然后,您可以手动清除并重新添加内容到列表框中。
Simple WPF DataBinding of a ListBox to an ObservableCollection of strings
答案 1 :(得分:0)
我认为你会发现列表框中的移动项目充其量存在问题。您会发现使用List&lt;&gt;会更容易并使其成为列表框的数据源。每次列表更改都会重建列表框。