wpf 如何在Stackpanel中更改元素的位置?

utugiqy6  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(372)

我有一个Stackpanel与5个孩子。

<StackPanel Orientation="Horizontal">
        <TextBlock >1</TextBlock>
        <TextBlock >2</TextBlock>
        <TextBlock >3</TextBlock>
        <TextBlock >4</TextBlock>
        <TextBlock >5</TextBlock>
    </StackPanel>

我想改变孩子的位置[2]。
如何在运行时改变元素的位置?

6vl6ewon

6vl6ewon1#

它可以通过跟踪StackPanel的Children-property的index-element来实现。我给你发了一些示例代码来演示它的工作原理。例如,考虑以下代码:

int currentSelectedIndex = stackPanel1.Children.IndexOf(CurrentSelectedTextBlock);
    int downIndex = currentSelectedIndex + 1;
    int childCount = stackPanel1.Children.Count;
    if (downIndex < childCount)
    {
        stackPanel1.Children.RemoveAt(currentSelectedIndex);
        stackPanel1.Children.Insert(downIndex, CurrentSelectedTextBlock);
    }
    else if (downIndex == childCount)
    {
        stackPanel1.Children.RemoveAt(currentSelectedIndex);
        stackPanel1.Children.Insert(currentSelectedIndex, CurrentSelectedTextBlock);
    }

它获取当前选中的TextBlock并将其索引向上移动一个。然后您需要通过删除并重新插入来更新StackPanel的Children-property。
我怀疑你是否想使用StackPanel来实现这种目的。使用ItemsControl要容易得多,比如ListBox,因为它们可以绑定到T的ObservableCollection。一旦绑定的集合被更新,控件也会被更新。
我希望这能有所帮助。示例代码可以下载here

q9rjltbz

q9rjltbz2#

这个问题有点不清楚,因为意图不是很明确。下面的代码允许您根据Text-content-property移动TextBlock:

string number = "4";
    TextBlock textBlockToSearch = null;

    foreach (var child in stackPanel1.Children)
    {
        if (child is TextBlock)
        {
            var textBlock = (TextBlock) child;
            if (textBlock.Text.CompareTo(number) == 0)
                textBlockToSearch = textBlock;
        }
    }

    if (textBlockToSearch != null)
    {
        stackPanel1.Children.Remove(textBlockToSearch);
        int pos = 2;
        stackPanel1.Children.Insert(pos - 1, textBlockToSearch);
    }
    else
    {
        Debug.WriteLine("Could not find TextBlock");
    }

如果您有其他意图,例如使用鼠标选择TextBlock,则可能需要使用不同的技术,例如在设计时在Visual Studio界面中看到的技术。
希望这能帮上忙。

r1zk6ea1

r1zk6ea13#

您可以使用Children.Insert方法将Element插入到StackPanel的插槽中。

StackPanel stackPanel = new StackPanel();
Image newElement = new Image();

// Add UIElements to StackPanel
stackPanel.Children.Add(new TextBlock() { Text = "Element 1" });
stackPanel.Children.Add(new TextBlock() { Text = "Element 2" });
stackPanel.Children.Add(new TextBlock() { Text = "Element 3" });

// Insert Grid as the first element in StackPanel
stackPanel.Children.Insert(0, newElement);

这里是documentation

相关问题