3

我有一个有 5 个孩子的 Stackpanel。

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

我想改变孩子[2]的位置。

如何在运行时更改元素的位置?

4

2 回答 2

4

它可以通过跟踪 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。一旦绑定的集合更新,控件也会更新。

我希望这有帮助。示例代码可以在这里下载。

于 2012-10-23T19:35:15.150 回答
0

这个问题有点不清楚,因为意图不是很具体。以下代码允许您根据 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 界面中看到的。

希望这可以帮助。

于 2012-10-21T10:39:06.140 回答