Не добавляется динамически кнопка в stackpanel
Хочу сделать так, чтобы в stackpanel было столько кнопок, сколько файлов есть в определенной папке. Считаю эти файлы с помощью отдельного файла, где и их число и записывается( я понимаю, что это кривая фигня). Считает количество файлов оно исправно, но по какой то причине кнопки не добавляются совсем.
public StackPanel stackPanel = new();
public Open_KillTeam_List op_KT_list;
public Open_KillTeam_List()
{
Border border = new Border() { };
InitializeComponent();
for (int i = 0; i <= File.ReadLines("D:\\Visual studio\\C#\\Kill Team\\Kill Team\\KT_Lists\\Paths (Dont Touch).txt").Count(); i++)
{
Button button = new Button();
button.Name = "File";
button.Height = 50;
button.Width = 658;
button.FontSize = 30;
button.Background = new SolidColorBrush(Colors.OrangeRed);
button.Foreground = new SolidColorBrush(Colors.White);
button.FontWeight = FontWeights.Bold;
// stackPanel.Children.Add(button);
// stackPanel.Children.Add(border);
button.Content = stackPanel;
// op_KT_list.UpdateLayout();
}
}
Код XAML:
<Window x:Class="Kill_Team.Open_KillTeam_List"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Kill_Team"
mc:Ignorable="d"
Closing="Window_Closing"
Title="Open" Height="450" Width="800" MaxHeight="450" MaxWidth="800" MinHeight="450" MinWidth="800" Background="DarkSlateGray">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button
Name="Open_Explorer"
Content="Open Explorer"
FontSize="30"
Width="280"
Height="80"
Background="OrangeRed"
Foreground="White"
FontWeight="Bold"
Grid.ColumnSpan="1"
Grid.RowSpan="1"
Grid.Row="2"
Grid.Column="1"
Panel.ZIndex="1"
Click="Open_Explorer_Click"/>
<Button
Name="Cancel"
Content="Cancel"
FontSize="30"
Width="280"
Height="80"
Background="OrangeRed"
Foreground="White"
FontWeight="Bold"
Grid.ColumnSpan="1"
Grid.RowSpan="1"
Grid.Row="2"
Grid.Column="0"
Panel.ZIndex="1"
Click="Cancel_Click"/>
<ScrollViewer
Name="KT_Lists"
FontSize="30"
Width="700"
Height="250"
Background="DarkGray"
Foreground="Black"
FontWeight="Bold"
Grid.ColumnSpan="2"
Grid.RowSpan="2"
Grid.Row="0"
Grid.Column="0"
Panel.ZIndex="1">
<StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>
</Window>
Я и с Children.Add пытался, и с button.Content, но по какой то причине ничего из этого не работает. Вот как выглядит эта stackpanel в окне:

Вот эта серая зона должна быть заполнена кнопками в соответствие с числом файлов.
Мой вопрос: Почему кнопки не создаются в окне?
Ответы (1 шт):
Не пишите никогда свой код в конструкторе. Писать разметку окна в C# - это тоже неудобно и чревато сюрпризами, научитесь использовать привязки данных.
Создать коллекцию и назначить DataContext
public ObservableCollection<string> Items { get; } = new();
public Open_KillTeam_List()
{
InitializeComponent();
DataContext = this;
Loaded += Open_KillTeam_List_Loaded;
}
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}"
Margin="3"
Height="50" Width="658"
FontSize="30"
Background="OrangeRed"
Foreground="White"
Click="ItemsButton_Click"/>
</Datatemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Положите это в свой <ScrollViewer> и готово.
Теперь в обработчики
private void Open_KillTeam_List_Loaded(object sender, RoutedEventArgs e)
{
Items.Add("Привет");
Items.Add("Мир");
}
private void ItemsButton_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
MessageBox.Show((string)btn.DataContext);
}
По умолчанию ItemsControl использует StackPanel. Но если надо поменять на другую панель или настройки StackPanel, то это сделать легко
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<!-- ... -->
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>