WPF动态控件

时间:2012-12-26 22:39:12

标签: c# wpf wpf-controls

我想遍历文件夹中的所有文件,并为找到的每个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" />

由于

2 个答案:

答案 0 :(得分:2)

我不会在代码隐藏中做那么多。只是为了获取文件。 我会得到一个ObservableCollection,其中字符串是文件的FullName。 然后我将它呈现在ListBox或ListView中,ItemSource绑定到集合并为控件定义好的ItemTemplate。 在模板中,您可以使用转换器为模板中的图像创建å来源。

答案 1 :(得分:0)

添加一个小样本只是为了省去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
}