如何在XAML / C#中动态创建按钮/快捷方式

时间:2018-08-29 11:09:18

标签: c# wpf xaml

我想创建一个应用程序,用户可以在其中输入文件的快捷方式。我知道如何在编译时在代码中创建按钮,但是我不知道如何在名称和click事件将是动态的情况下创建动态按钮。

创建类似下图的图像将有多困难?在C#/ WPF / XAML中甚至可能吗?

逻辑是什么?

仅供参考-我不需要保存按钮对象的帮助,为此,我将使用JSON。

enter image description here

2 个答案:

答案 0 :(得分:3)

您应该创建一个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个属性:

  • 公共字符串WhateverYouWantToShow-这将是按钮的内容
  • public ICommand YourCommand-这将有一个DelegateCommand<string>,将是“执行”操作的人。您创建的每个项目的命令都相同。您只需要一个文件,因为您将使用该参数来执行/打开一个文件或另一个文件。
  • 公共字符串YourFileName-这是执行命令方法所需的字符串。我想这将是路径或文件名。

现在我们已经创建了此类,当初始化第三个视图(带有按钮的视图)时,您将拥有ObservableCollection个对象,YourListOfLinkObject个属性,我称之为FileLink 。在那里,您将必须添加从数据库中获取的FileLink个对象,它们将被显示。

如果您需要更改其显示方式,则只需修改DataTemplate

如果有什么我无法再次解释的或者您想让我进一步讲,请告诉我:)

答案 1 :(得分:0)

这是可能且简单的。您将控件添加到您的容器,并将容器添加到主窗体。 Click事件仅在代码中定义(实际上您在开发时就知道了-可能应该改为使用用户控件)。 下面是一些部分代码,在几年前的现实世界中的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);
    }