在WPF中复制Windows资源管理器文件夹UI的功能的最佳方式是什么?

问题描述:

所以我使用FileSystemWatcher来填充和更新播放列表。我希望复制Windows资源管理器的很多功能,最重要的是:
*内联重命名
*缓慢双击重命名在WPF中复制Windows资源管理器文件夹UI的功能的最佳方式是什么?

我有一个相当麻烦这样做,所以我想,也许还有比更简单的方法重新实现车轮?也许我可以以某种方式作为控件在我的应用程序中托管Windows资源管理器窗口?

在您的应用程序中托管一个真正的Windows资源管理器窗口是可能的,但充满了危险:技术是不同的XP与Vista与Win7和你将处理各种低级别的东西。我强烈建议不要尝试它。

我觉得你最好的选择是:

  1. 使用Microsoft.Win32.OpenFileDialog如果它可以很容易地适应您的需求,或者
  2. 代码自己的功能,或者如果你很勇敢:
  3. 启动一个单独的浏览器窗口,任选代码,试图迫使其位置和大小将超过您的应用程序(这也是辛苦......)

不es on内联重命名功能

内联重命名和慢速双击以重命名功能实现起来相当微不足道。

在您的视图模型添加:

  • A “新名称” 字符串的DependencyProperty
  • A “重命名” 布尔的DependencyProperty用PropertyChangedCallback。当“重命名”变为真时,将Name复制到NewName。当它变为false时,如果NewName!= Name将文件重命名为更新名称。

在您的DataTemplate中,在“重命名”中添加一个触发器,用绑定到“NewName”的TextBox替换绑定到“Name”的TextBlock。

添加这些事件处理程序: * KeyDown事件:如果按下F2键切换重命名。如果按Enter键并重命名,则设置Renaming = false。如果Esc被按下,并将Name重命名为NewName并将Renaming = false。 * LostFocus事件:设置重命名= false *容器上的SelectionChanged事件:记录上次选择更改的时间戳。 *鼠标事件:如果鼠标左键单击并且选择改变> 0.5秒前,设置重命名= true

资源管理器视图的许多其他功能同样很容易实现,例如分组和多列。

希望这会有所帮助。

+0

内联重命名的难点在于所有这些小东西,例如跨越多个列以容纳文本但不超过ListView边缘的编辑框。 – CannibalSmith 2010-02-15 09:58:23

+0

你可以使用Adorner来解决这个问题。创建Adorner,绑定其DataContext并使用触发器设置的附加属性将其添加到AdornerLayer。使用ControlTemplate实例化Adorner中的TextBox。在您的装饰者的MeasureOverride中,搜索其目标的可视化树,以查看其第一个包含ListView,TransformToDescendant的右侧边缘,然后减去以获取适当的宽度。使用孩子的身高。在ArrangeOverride中,如果它发生更改,则重做相同的计算和InvalidateMeasure()。 – 2010-02-15 19:07:53

+0

但Adorner不支持模板。 – CannibalSmith 2010-02-16 14:51:08