【问题标题】:What's the best way to replicate the functionality of a Windows Explorer folder UI in WPF?在 WPF 中复制 Windows 资源管理器文件夹 UI 功能的最佳方法是什么?
【发布时间】:2010-02-11 18:46:15
【问题描述】:

所以我使用FileSystemWatcher 来填充和更新播放列表。我想复制 Windows Explorer 的许多功能,最重要的是:
* 内联重命名
* 慢速双击重命名

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

【问题讨论】:

    标签: wpf windows user-interface windows-explorer


    【解决方案1】:

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

    我认为你最好的选择是:

    1. 如果 Microsoft.Win32.OpenFileDialog 可以轻松适应您的需要,请使用它,或者
    2. 编写您自己的功能,或者如果您非常勇敢:
    3. 启动一个单独的资源管理器窗口,可选择使用试图强制其位置和大小超出您的应用程序的代码(这也很难......)

    内联重命名功能说明

    内联重命名和慢速双击重命名功能实现起来真的很简单。

    在您的视图模型中添加:

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

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

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

    Explorer 视图的许多其他功能同样易于实现,例如分组和多列。

    希望这会有所帮助。

    【讨论】:

    • 内联重命名的难点在于所有那些小东西,比如跨越多列的编辑框以容纳文本,但不能超出ListView的边缘。
    • 你可以使用装饰器来解决这个问题。创建 Adorner,绑定其 DataContext 并使用触发器设置的附加属性将其添加到 AdornerLayer。使用 ControlTemplate 实例化 Adorner 中的 TextBox。在您的装饰器的 MeasureOverride 中,向上搜索其目标的可视树以查找第一个包含 ListView、TransformToDescendant 其右侧边缘,然后减去以获得正确的宽度。使用孩子的身高。在 ArrangeOverride 中重做相同的计算和 InvalidateMeasure() 如果它发生了变化。
    • 但是 Adorner 不支持模板化。
    • 是的。这意味着您需要在您的Adorner 中添加一个Control。我从我编写的一个小类中派生了大部分装饰器,该类在构造函数中创建了一个Control,并将其Template 属性绑定到本地AddOwnered“模板”属性并将其存储在一个字段中,然后覆盖VisualChildrenCount返回 1 和 GetVisualChild() 返回控件。这使得模板可以很容易地与装饰器一起使用。请注意,我使用的Control 是用new Control() 构造的,换句话说,它不是Control 的子类。
    • AddOwnered 属性的绑定是这样的:_control.SetBinding(TemplateProperty, new Binding("Template") { Source = this });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2012-02-03
    • 2010-11-29
    • 2010-09-06
    相关资源
    最近更新 更多