2013-10-09 101 views
1

在列表框中,我有一個堆棧面板的行..並在每個堆棧面板中移動一行並向下移動按鈕...我無法編碼它雖然。這就是我對拉昇例如:向上/向下移動按鈕在列表框中使用StackPanel

  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

'selectedIndex> 0 && selectedIndex!= -1'真的都是? :D – LPL

+0

哈哈哎呀沒有注意到.. – user1189352

回答

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); 
      } 
     } 
    } 
} 

此代碼編譯並運行,所以應該是你一個很好的起點。

這是執行它的複雜/缺陷方式。有一些比較複雜/更專業的方法,比如Databinding。

如果你真的想成爲精英,看看數據綁定到列表框。

基本上會發生什麼是你創建所有的對象,並把它們放在一個可觀察的集合。然後,不要手動清理和重新添加東西到你的列表框中,你可以操作集合。

Simple WPF DataBinding of a ListBox to an ObservableCollection of strings

+0

嗯有道理。想着我該怎麼做,雖然..期待你的代碼 – user1189352

+0

geeze不知道它會是複雜的,tyvm – user1189352

+1

@ user1189352代碼中的一個oopsie確保你把它轉換爲StackPanel而不是ListBoxitem –

0

我想你會發現最好在有問題的一個列表框走動的物品。您會發現使用列表<>併爲該列表框創建數據源要容易得多。每次列表更改重建列表框。

+0

嗯。對WPF和C#來說還是一個新的東西,所以我不太瞭解這些東西。謝謝你的推薦 – user1189352

相關問題