2017-02-17 5 views
0

Angenommen, meine App verfügt über eine Schaltfläche, die eine weitere Schaltfläche hinzufügt. Wenn ich es drücke, sollte eine andere Taste neben der ersten Taste erscheinen. Die neue Schaltfläche sollte auch die Schaltfläche "Add a new button" werden.Programmatisch Schaltflächen zu einer UWP-App hinzufügen

Wie mache ich das?

Mein Ansatz war ein RelativePanel zu erstellen, weil Sie im Editor sagen können: "Platzieren Sie das links davon". Es kann jedoch keine Möglichkeit finden, dies in C# -Code zu tun.

+1

Sie können die Ausrichtung in C# mit der RelativePanel-Klasse festlegen, zum Beispiel RelativePanel.SetLeftOf (buttonA, buttonB) – ctron

Antwort

1

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.

+0

Nun, wie gebe ich das Verhalten der frisch generierten Schaltflächen an? Ich möchte nicht, dass sie andere Buttons hinzufügen, sie sollten etwas anderes machen. –

+0

@DanielKrenn Es gibt mehrere Möglichkeiten, das zu tun, sehr einfach mit der relativen Option, wo Sie einfach einen neuen Eventhandler für jede erstellte Schaltfläche erstellen können. Mit der Methode list können Sie eine Klasse für Ihr Objekt definieren, einen geeigneten Delegaten dort platzieren oder ein Befehlsmuster verwenden und dann bei der Erstellung des Elements definieren, was es tun soll. Probieren Sie es selbst aus, wenn Sie keinen Erfolg haben, schreiben Sie eine weitere Frage zu SO mit Reprodcode und Beschreibung, was Sie erreichen wollen. – Romasz

Verwandte Themen