Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF动态控件_C#_Wpf_Wpf Controls - Fatal编程技术网

C# WPF动态控件

C# WPF动态控件,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我希望遍历文件夹中的所有文件,并为找到的每个JPEG文件动态创建图像控件。一旦完成,我想要一个充满动态创建的图像控件的表单(想想几乎所有的照片查看软件,比如具有缩略图视图的Picasa) 我希望通过实现某种拖放事件处理程序,能够对表单上这些动态创建的图像控件重新排序。我不知道会遇到多少图像,因此无法为每个可能存在或不存在的图像控件硬编码事件处理程序。因此,我正在寻找一种方法来动态地将事件处理程序添加到动态创建的控件中 下面代码中使用的方法几乎就是我想要的。下面的方法的问题是,如果我不知道控件的名

我希望遍历文件夹中的所有文件,并为找到的每个JPEG文件动态创建图像控件。一旦完成,我想要一个充满动态创建的图像控件的表单(想想几乎所有的照片查看软件,比如具有缩略图视图的Picasa)

我希望通过实现某种拖放事件处理程序,能够对表单上这些动态创建的图像控件重新排序。我不知道会遇到多少图像,因此无法为每个可能存在或不存在的图像控件硬编码事件处理程序。因此,我正在寻找一种方法来动态地将事件处理程序添加到动态创建的控件中

下面代码中使用的方法几乎就是我想要的。下面的方法的问题是,如果我不知道控件的名称,就无法硬编码事件处理程序

public partial class RoutedEventAddRemoveHandler {
  void MakeButton(object sender, RoutedEventArgs e)
  {
      Button b2 = new Button();
      b2.Content = "New Button";
      // Associate event handler to the button. You can remove the event  
      // handler using "-=" syntax rather than "+=".
      b2.Click  += new RoutedEventHandler(Onb2Click);
      root.Children.Insert(root.Children.Count, b2);
      DockPanel.SetDock(b2, Dock.Top);
      text1.Text = "Now click the second button...";
      b1.IsEnabled = false;
  }
  void Onb2Click(object sender, RoutedEventArgs e)
  {
      text1.Text = "New Button (b2) Was Clicked!!";
  } 
}
注意,我正在寻找一个c代码而不是XAML的解决方案。这是一个使用如下代码添加控件的解决方案:

// What I want
Fields.Add(new Field() { Name = "Username", Length = 100, Required = true });
不是这样的:

// What I do not want
<TextBox Width="100" Canvas.Left="50" Canvas.Top="20" />
//我不想要什么

感谢您添加了一个小示例,以省去在WPF代码中加载图像的痛苦

void OnButtonClick(object sender, RoutedEventArgs routedEventArgs)
{
    var files = Directory.GetFiles(@"C:\img");
    foreach (var file in files)
    {
        var bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.UriSource = new Uri(file);
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.EndInit();
        var img = new Image { Source = bitmap };
        img.MouseDown += OnImageMouseDown;
        //Add img to your container
    }
}

void OnImageMouseDown(object sender, MouseButtonEventArgs e)
{
    var img = sender as Image;
    //Operate
}

我不会在代码背后做那么多。只是为了得到文件。 我将得到一个ObservableCollection,其中字符串是文件的全名。 然后,我将在列表框或列表视图中显示它,将ItemSource绑定到集合并为控件定义良好的ItemTemplate。
在模板中,您可以使用转换器为模板中的图像创建å源。

到目前为止您尝试了什么?从您的代码来看,您似乎已经知道如何在代码隐藏中创建控件,向它们添加事件处理程序并将它们插入容器中。我知道如何创建控件。我知道什么是代码背后的想法-从谷歌告诉我它与ASP.NET相关,因此在这里没有相关性。我知道如何添加事件处理程序,但不知道如何为动态创建的控件添加事件处理程序。我也不知道为什么这个问题被否决了,因为它看起来非常聪明,研究得很好。但是你用
MakeButton
方法这么做,你怎么不知道?每次调用它时,您都会创建一个新按钮,将
Onb2Click
处理程序添加到其
Click
事件中,并将其添加到
root
。好的。我想我可以理解。第一次你给了我太多的信任:-)。这些代码来自我在研究这个问题时遇到的另一个stackoverflow问题。。。我不明白它在做什么。太棒了,我有了解决方案,并且认识到了它,因为我不理解它。谢谢伊芙。我只是想测试一下,如果它有效的话,我会让你把它作为一个答案,这样我就可以为像我这样的任何人将它标记为已解决。使用XAML,如果你只在代码中这样做,你会弄得一团糟。您需要绑定到文件对象列表的ItemsControl(例如ListView)和包含图像的DataTemplate(源应绑定到文件路径)。然后可以定义要在数据模板中使用的任何事件处理程序。