我想创建一个应用程序,用户可以在其中输入文件的快捷方式。我知道如何在编译时在代码中创建按钮,但是我不知道如何在名称和click事件将是动态的情况下创建动态按钮。
创建类似下图的图像将有多困难?在C#/ WPF / XAML中甚至可能吗?
逻辑是什么?
仅供参考-我不需要保存按钮对象的帮助,为此,我将使用JSON。
答案 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个属性:
DelegateCommand<string>
,将是“执行”操作的人。您创建的每个项目的命令都相同。您只需要一个文件,因为您将使用该参数来执行/打开一个文件或另一个文件。现在我们已经创建了此类,当初始化第三个视图(带有按钮的视图)时,您将拥有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);
}