如何更改 WPF 项组合中的面板位置

本文关键字:位置 组合 何更改 WPF | 更新日期: 2023-09-27 18:33:52

我的 WPF 应用程序代码在文件中定义的函数调用.cs生成面板。代码中使用了 ItemControl 来生成这些面板。我想向上或向下移动面板。

示例:有三个面板面板A,面板B,面板C现在每个面板都有按钮可以向上移动。现在我选择了潘乐B。我点击那个按钮,面板B现在应该像面板B,面板A,面板C一样向上移动

.XAML 文件:

<ItemsControl x:Name="lstItems" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}" FontSize="{Binding FontSize, Mode=OneWay}" />
                <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

.CS文件:

  public partial class MainWindow : Window
  {
  protected ObservableCollection<MyPanel> texts = new ObservableCollection<MyPanel>();
public MainWindow()
{
    InitializeComponent();
    texts.Add(new MyPanel() { Text = "Test 1" });
    texts.Add(new MyPanel() { Text = "Test 2" });
    lstItems.ItemsSource = texts;
   }
}
 public class MyPanel : INotifyPropertyChanged
{
  private string _id;
  private string _text;
  private double _fontSize = 10;
  public string Id
  {
      get { return _id; }
     set
    {
        if (value != _id)
        {
            _id = value;
            NotifyPropertyChanged();
         }
     }
 }
public string Text
{
    get { return _text; }
    set
     {
         if (value != _text)
         {
             _text = value;
             NotifyPropertyChanged();
         }
     }
 }
 public double FontSize
{
    get { return _fontSize; }
    set
    {
        if (value != _fontSize)
        {
            _fontSize = value;
            NotifyPropertyChanged();
        }
    }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

}

编辑:XAML 文件:

   <ItemsControl x:Name="lstItemsClassM" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                <ComboBox x:Name="cboOccupation" IsEditable="False"  HorizontalAlignment="Left"
        Text="{Binding Path=Alignment, Mode=TwoWay}"
        Margin="4" Width="140">
                        <ComboBoxItem>Right</ComboBoxItem>
                        <ComboBoxItem>Left</ComboBoxItem>
                    </ComboBox>
                    <Button Content="Move Up" Click="Button_Click_1" Tag="{Binding PKId}"/>
                    <Button Content="{Binding Alignment, Mode=TwoWay}" Click="Button_Click" Tag="{Binding PKId}" SourceUpdated="Button_SourceUpdated" />
                    <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}" FontSize="{Binding FontSize, Mode=OneWay}" TextAlignment="{Binding Alignment, Mode=OneWay}"  />
                    <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

.CS文件:

 public partial class Window2 : Window
{
    protected ObservableCollection<ClassM> texts = new ObservableCollection<ClassM>();
    int dv;
    public Window2()
    {
        InitializeComponent();
        dv=1;
        texts.Add(new ClassM() { PKId=dv, Text = "Test 1" });
        dv=2;
        texts.Add(new ClassM() { PKId=dv, Text = "Test 2" });
        lstItemsClassM.ItemsSource = texts;
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var myValue = ((Button)sender).Tag;
            foreach (var f in texts.ToList())
            {
                if (f.PKId.ToString() == myValue.ToString())
                {
                    f._alignment = "Right";
                    MessageBox.Show(f._alignment);
                }
            }
    }
    private void Button_SourceUpdated(object sender, DataTransferEventArgs e)
    {
        var myValue = ((Button)sender).Tag;
        foreach (var f in texts.ToList())
        {
            if (f.PKId.ToString() == myValue.ToString())
            {
                f._alignment = "Right";
                MessageBox.Show(f._alignment);
            }
        }
    }
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        var myValue = ((Button)sender).Tag;
       foreach (var f in texts.ToList())
        {
            if (f.PKId.ToString() == myValue.ToString())
            {
                int s = f.PKId + 1;
                texts.Move(f.PKId , s);
                MessageBox.Show(f.PKId +"  &&&&& " + s );
            }
        }
    }

}

public class ClassM : INotifyPropertyChanged
{
    private string _id;
    private int _pkid;
    private string _text;
    private double _fontSize = 10;
    public bool _isChecked { get; set; }
    public string _alignment="Left";
    public int PKId
    {
        get { return _pkid; }
        set
        {
            if (value != _pkid)
            {
                _pkid = value;
                NotifyPropertyChanged();
            }
        }
    }
    public string Id
    {
        get { return _id; }
        set
        {
            if (value != _id)
            {
                _id = value;
                NotifyPropertyChanged();
            }
        }
    }
    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            if (value != _isChecked)
            {
                _isChecked = value;
                NotifyPropertyChanged();
            }
        }
    }
    public string Text
    {
        get { return _text; }
        set
        {
            if (value != _text)
            {
                _text = value;
                NotifyPropertyChanged();
            }
        }
    }
    public double FontSize
    {
        get { return _fontSize; }
        set
        {
            if (value != _fontSize)
            {
                _fontSize = value;
                NotifyPropertyChanged();
            }
        }
    }
    public string Alignment
    {
        get { return _alignment; }
        set
        {
            if (value != _alignment)
            {
                _alignment = value;
                NotifyPropertyChanged();
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

}

如何更改 WPF 项组合中的面板位置

使用 ObservableCollection 的 Move 方法:

private void Swap(MyPanel a, MyPanel b)
{
    var indexA = texts.IndexOf(a);
    var indexB = texts.IndexOf(b);
    texts.Move(a,b);
}

在 MainWindow 中创建命令,说 MovePanelCommand 并将 Button commmand 绑定到此命令,并将当前项目作为命令参数发送

<StackPanel Orientation="Vertical">
                <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}" FontSize="{Binding FontSize, Mode=OneWay}" />
                <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" />
                <Button Command="{Binding DataContext.MovePanelCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParamter="{Binding}"/>
 </StackPanel>

现在在命令处理程序中,您将获得要向上移动的面板

private void MovePanelCommandHandler(object param)
{
    MyPanel panel = param as MyPanel;
  // Just move the panel one index up with validation if it is a first panel
}