siebren beens Ответов: 2

Динамический элемент управления TabControl с динамическими кнопками


проблема в том, что я получаю только 1 кнопку в каждом элементе вкладки. и я получаю tabitem для каждого файла в определенной папке. вместо всего лишь пары заголовков

в каталоге звуков есть 5 папок, (набор 1-5) они мне нужны как tabitem.header. и в этих папках я хочу, чтобы кнопки были связаны с файлами в наборе 1-5

я надеюсь, что проблема ясна. я совершенно новичок в кодировании на c#. приношу свои извинения за мой плохой английский.

может ли some1 plz помочь мне здесь?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();


        string path1 = @"d:\\root\\sounds\\";   /*Environment.GetFolderPath(Environment.SpecialFolder.Desktop);*/
        string[] files = Directory.GetFiles(path1, "*.*", SearchOption.AllDirectories);
        string[] dir = Directory.GetDirectories(path1);
        string result;





        foreach (string sFile in files)
        { 
            Button nwbut = new Button();
            result = System.IO.Path.GetFileNameWithoutExtension(sFile);
            nwbut.Content = result;
            nwbut.Height = 30;
            nwbut.Width = 80;
            nwbut.Margin = Margin = new Thickness(5, 5, 5, 5);
            nwbut.Click += (s, e) => { mediaElement2.Source = new Uri(sFile); };
            WrapPanel wp = new WrapPanel();
            wp.Children.Add(nwbut);

            Grid gr = new Grid();
            gr.Children.Add(wp);
            TabItem ti = new TabItem();
            ti.Content = gr;

                foreach  (string header in dir)
                    ti.Header = System.IO.Path.GetFileNameWithoutExtension(header);
                    tc.Items.Add(ti);
            }
        }
   }
}


Что я уже пробовал:

я пробовал разные приложения foreach, но не могу заставить его работать

Gerry Schmitz

Вы не объяснили, в чем смысл всего этого. Немногие люди смогут дать вам свой лучший совет. Индикаторы состоят в том, что "кнопки на вкладках" на лету не являются идеальным решением для того, что бы вы ни пытались сделать.

А ваш конструктор слишком занят. Большая часть / все это должно происходить в вашем "загруженном" обработчике событий.

Richard Deeming

Репост
Вы уже опубликовали это на форуме WPF:
https://www.codeproject.com/Messages/5601369/dynamic-tabitems-with-dynamic-buttons-in-each-tabi.aspx[^]

2 Ответов

Рейтинг:
0

TheRealSteveJudge

Проблема в том, что у вас нет ни одной достойной модели данных.
Кроме того, это не очень хорошая идея, чтобы собрать пользовательский интерфейс, как вы пытаетесь сделать. Вместо этого используйте XAML.

Начнем с модели для звукового файла:
Звукового файла.в CS

namespace DynamicTest.Models
{
    public class SoundFile
    {
        public string Filename { get; set; }
    }
}

Вам также нужна модель для SoundSet:
Набор звуков.в CS
using System.Collections.Generic;

namespace DynamicTest.Models
{
    public class SoundSet
    {
        public string Foldername { get; set; }

        public List<SoundFile> SoundFiles { get; set; }

        public SoundSet()
        {
            SoundFiles = new List<SoundFile>();
        }
    }
}


Файл MainWindow.язык XAML.в CS
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using DynamicTest.Models;

namespace DynamicTest
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            Loaded += MainWindow_Loaded;

            InitializeComponent();
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var sourcePath = @"c:\temp\root\sounds";

            var subdirs = Directory.GetDirectories(sourcePath);

            var soundSets = new List<SoundSet>();

            foreach (var subdir in subdirs)
            {
                var soundSet = new SoundSet {Foldername = subdir};
                
                var filenames = Directory.GetFiles(subdir);

                foreach (var filename in filenames)
                {
                    soundSet.SoundFiles.Add(new SoundFile {Filename = filename});
                }

                soundSets.Add(soundSet);
            }

            MyTabControl.ItemsSource = soundSets;
            MyTabControl.SelectedIndex = 0;
        }

        private void ButtonPlay_OnClick(object sender, RoutedEventArgs e)
        {
            var button = sender as Button;

            if(button == null) return;

            var filename = button.Tag as string;

            // Here you can do whatever you want with the filename
        }
    }
}


Файл MainWindow.язык XAML
<Window x:Class="DynamicTest.MainWindow"
        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:DynamicTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl Name="MyTabControl">
            <TabControl.ItemTemplate>
                <DataTemplate>
                   <TextBlock Text="{Binding Foldername}"></TextBlock>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                   <DataGrid ItemsSource="{Binding SoundFiles}"
                             AutoGenerateColumns="False"
                             CanUserAddRows="False">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn>
                                <DataGridTemplateColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock Text=""></TextBlock>
                                    </DataTemplate>
                                </DataGridTemplateColumn.HeaderTemplate>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <Button Name="ButtonPlay"
                                                Width="75"
                                                Height="25"
                                                Margin="5"
                                                Content="Play"
                                                Tag="{Binding Filename}"
                                                Click="ButtonPlay_OnClick"></Button>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTemplateColumn Width="*">
                                <DataGridTemplateColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="Filename"></TextBlock>
                                    </DataTemplate>
                                </DataGridTemplateColumn.HeaderTemplate>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Filename}"></TextBlock>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>


Рейтинг:
0

siebren beens

тем временем я ждал помощи по своему коду, я изменил свой код на рабочий код. теперь я вижу, что это не так, как программисты обычно кодируют. но я работаю так, как задумано.

не могли бы вы взглянуть на него и прокомментировать?

файл MainWindow.язык XAML.в CS

using System.IO;
using System.Windows;
using System.Windows.Controls;

namespace reflex_scherm
{
   
    public partial class MainWindow : Window
    {
        
        public MainWindow()
        {
            InitializeComponent();

            string path1 = @"d:\root\sounds\";   
            string[] dir = Directory.GetDirectories(path1);
            string result;
            foreach (string header in dir)
            {
                TabItem ti = new TabItem();
                Grid gr = new Grid();
                WrapPanel wp = new WrapPanel();
                result = Path.GetFileNameWithoutExtension(header);
                string[] files = Directory.GetFiles(path1 + result, "*.*", SearchOption.AllDirectories);
               
                
                ti.Header = Path.GetFileNameWithoutExtension(header);
                tc.Items.Add(ti);
                ti.Content = gr;
                gr.Children.Add(wp);
                foreach (string file in files)
                {
                    string filenaam1 = Path.GetFileNameWithoutExtension(file);
                    Button btn = new Button();
                    btn.Content = filenaam1;
                    btn.Height = 30;
                    btn.Width = 120;
                    btn.Margin = Margin = new Thickness(5, 5, 5, 5);
                    btn.Click += (s, e) => { mediaElement2.Source = new System.Uri(file);
                        mediaElement2.Play();
                    };
                    wp.Children.Add(btn);

                }
                Button btn1 = new Button();
                btn1.Content = "stop";
                btn1.Height = 30;
                btn1.Width = 80;
                btn1.HorizontalAlignment = HorizontalAlignment.Right;
                btn1.VerticalAlignment = VerticalAlignment.Bottom;
                gr.Children.Add(btn1);
                btn1.Click += (s, e) => { mediaElement2.Pause(); };
            }
    
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.MainWindow.Close();
        }
    }
}



файл MainWindow.язык XAML

<pre lang="c#"><Window x:Class="reflex_scherm.MainWindow"
        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:reflex_scherm"
        mc:Ignorable="d"
        Title="MainWindow" Height="1080" Width="1920" WindowState="Maximized" WindowStyle="None">
    <Window.Resources>
        <Color x:Key="punten">Black</Color>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0*" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TabControl x:Name="tc" HorizontalAlignment="Right" Height="463" Margin="0,0,-0.4,0" VerticalAlignment="Top" Width="293" Grid.ColumnSpan="2">
           </TabControl>
        <MediaElement x:Name="mediaElement2" HorizontalAlignment="Left" Height="100" Margin="1708,964,0,0" VerticalAlignment="Top" Width="100" LoadedBehavior="Manual" UnloadedBehavior="Stop" Grid.ColumnSpan="2" />
        <Button x:Name="button" Grid.ColumnSpan="2" Content="exit program" HorizontalAlignment="Right" Margin="0,10,10,10" VerticalAlignment="Bottom" Width="75" Click="button_Click"/>
    </Grid>
</Window>