Sie können ctron's comment folgen und dies tun, indem Sie den angehängten Eigenschaftswert im Code festlegen. Die Probe kann so aussehen - XAML:
<RelativePanel x:Name="myPanel" Margin="100">
<Button Content="StartBtn" Click="Button_Click"/>
</RelativePanel>
und in der Code-behind:
private void Button_Click(object sender, RoutedEventArgs e)
{
Button newButton = new Button { Content = "CreatedBtn" };
newButton.Click += Button_Click;
RelativePanel.SetLeftOf(newButton,sender);
myPanel.Children.Add(newButton);
}
Das wird gut funktionieren, aber wenn Sie doppelt mal einen Knopf klicken, wird der zweite neue erstellt ein überlappen der vom ersten Klick erzeugte. Wenn es sich nicht um ein gewünschtes Verhalten handelt, müssen Sie es anders machen. In diesem Fall benötigen Sie eine Liste mit Schaltflächen. Ich habe horizontal Listview dafür verwendet:
<ListView x:Name="myList">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" ScrollViewer.HorizontalScrollMode="Enabled" ScrollViewer.VerticalScrollMode="Disabled"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}" Click="ListButton_Click"/>
</DataTemplate>
</ListView.ItemTemplate>
<x:String>StartBtn</x:String>
</ListView>
private void ListButton_Click(object sender, RoutedEventArgs e)
{
int index = myList.Items.IndexOf((e.OriginalSource as FrameworkElement).DataContext);
myList.Items.Insert(index, $"Btn {myList.Items.Count}");
}
Dieses etwas mehr Styling brauchen, sollte aber die Grundidee zeigen.
Sie können die Ausrichtung in C# mit der RelativePanel-Klasse festlegen, zum Beispiel RelativePanel.SetLeftOf (buttonA, buttonB) – ctron