Как динамически создавать кнопки / ярлыки в XAML / C # - PullRequest
0 голосов
/ 29 августа 2018

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

Насколько сложно было бы создать что-то похожее на изображение ниже? Это возможно даже в C # / WPF / XAML?

Какая была бы логика?

К вашему сведению - мне не нужна помощь в сохранении объектов кнопок, для этого я буду использовать JSON.

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Это возможно и просто. Вы добавляете элементы управления в свой контейнер и добавляете контейнер в основную форму. Событие клика просто определяется в коде (что на самом деле вы знаете во время разработки - вероятно, вам следует вместо этого использовать пользовательские элементы управления). Ниже приведен частичный код, выполняющий аналогичную работу в реальном приложении Silverlight много лет назад, чтобы дать идею:

 ...
 sp.Children.Add(p);

        foreach (var slot in group)
        {
            var color = colors[(int)slot.State];
            var name = String.Format("W{0}", slot.When.ToString("yyyyMMddHHmm"));

            Rectangle rect = new Rectangle
            {
                Name = name,
                Width = rectWidth,
                Height = rectWidth,
                Margin = new Thickness(rectMargin),
                Stroke = new SolidColorBrush(slot.State == Availability.Booked ? Colors.White : Colors.Black),
                StrokeThickness = 1,
                Fill = new SolidColorBrush(color),
                RadiusX = 2,
                RadiusY = 2,
                Cursor = (slot.State == Availability.Booked ? Cursors.Arrow : Cursors.Hand)
            };
            if (slot.State != Availability.Booked)
            {
                rect.Effect = new DropShadowEffect(); //myDropShadowEffect,
            }
            if (slot.State != Availability.Booked)
            {
                rect.MouseLeftButtonDown += new MouseButtonEventHandler(rect_MouseLeftButtonDown);
                ToolTipService.SetToolTip(rect, slot.When.ToString("MMM dd,yyyy dddd hh:mm tt"));
            }
            sp.Children.Add(rect);
        }
        b.Child = sp;
        contentStackPanel.Children.Add(b);
    }
0 голосов
/ 29 августа 2018

Вы должны создать ItemsControl, чтобы показать, что вы хотите, это может быть подход:

<ItemsControl 
       ItemsSource="{Binding YourListOfLinkObject}">
       <ItemsControl.ItemTemplate>
          <DataTemplate>                  
                  <Button Content="{Binding WhateverYouWantToShow}"
                          Command="{Binding YourCommand} " 
                          CommandParameter="{Binding YourFileName}"/>                  
          </DataTemplate>
       </ItemsControl.ItemTemplate>   
</ItemsControl>

Вам следует создать новый (если он еще не создан) класс с именем файла, содержимым, которое вы хотите отобразить в кнопке, и вашей командой. А при инициализации представления создайте список объекта «Ссылка».

Команда будет одинаковой для всех из них, просто объявите ее в общем виде, чтобы открыть файл, который вы положили в CommandParameter


Теперь, когда я знаю, что вы используете MVVM, я постараюсь расширить фокус моего ответа на этом.

Вам нужен класс, который я назову FileLink. FileLink будет иметь, как минимум, 3 свойства:

  • публичная строка WhwhatYouWantToShow - это будет содержимое вашей кнопки
  • public ICommand YourCommand - Это будет DelegateCommand<string>, который будет тем, кто «делает» вещи. Эта команда будет одинаковой для каждого элемента, который вы создаете. Вам нужен только один, потому что вы будете использовать параметр для запуска / открытия того или иного файла.
  • public string YourFileName - это будет строка, необходимая для выполнения вашего командного метода. Я предполагаю, что это будет путь или имя файла.

Теперь, когда мы создали этот класс, при инициализации третьего вида, с кнопками, у вас будет свойство ObservableCollection, которое я назвал YourListOfLinkObject, из FileLink объектов. Там вам нужно будет добавить столько FileLink объектов, сколько вы получили из базы данных, и они будут отображены.

Если вам нужно изменить способ их отображения, вам просто нужно изменить DataTemplate.

Если что-то я не смог объяснить снова или вы хотите, чтобы я пошел дальше, просто дайте мне знать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...