これは、StackPanel の Children プロパティの index 要素を追跡することで実現できます。この動作を示すサンプル コードをお送りします。たとえば、次のコードを考えてみましょう。
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 を取得し、そのインデックスを 1 つ上に移動します。次に、StackPanel の Children-property を削除して再度挿入し、更新する必要があります。
この種の目的で StackPanel を使用するかどうかは疑問です。T の ObservableCollection にバインドできるため、ListBox のような ItemsControl を使用する方がはるかに簡単です。バインドされたコレクションが更新されると、コントロールも同様に更新されます。
これが役立つことを願っています。サンプルコードはこちらからダウンロードできます。