[英]How to replicate Windows Explorer column filtering on ListView control header
[英]Display custom header or column in Windows Explorer
我的應用程序向文件添加了一些自定義元數據。 我想像這樣在 Windows 資源管理器中顯示它:
或這個:
有沒有辦法在 .NET 中做到這一點?
在 Windows 文件管理器中構建自定義列有兩種方法:使用 Windows 屬性系統和雲存儲提供程序的屬性定義。 您通常會使用第一種方法為您擁有的文件類型創建自定義屬性。 在顯示來自文檔管理系統或任何其他存儲的自定義數據時,您將使用第二種方法。
您可以在 Windows Vista 和更高版本中為特定文件類型創建自定義屬性。 這些屬性可以是只讀的或讀寫的。 以及它們可以被 Window Search 索引器索引並參與搜索。 有一些限制:
...屬性處理程序不能在托管代碼中實現,而應在 C++ 中實現。
在 Windows 10 Creators Update 及更高版本中,您可以為使用Cloud Sync Engine API (存儲提供程序、Cloud Filter API)創建的文件系統添加自定義列。 此 API 用於 OneDrive 等工具。 您需要使用自定義屬性定義注冊 Cloud Storage Provider 同步根,為自定義列提供數據,最后使用 Cloud File/Cloud Filter API 實現 Cloud Storage Provider。
屬性定義與文件類型無關,可以為所有文件添加。 此外,即使 .NET 中只有一些 API 可用,您仍然可以調用 Win32 函數並僅使用托管代碼構建雲提供程序。
注冊雲存儲提供商。 以下是在 C# 中使用自定義列注冊存儲提供程序的示例:
StorageProviderSyncRootInfo storageInfo = new StorageProviderSyncRootInfo();
storageInfo.Path = await StorageFolder.GetFolderFromPathAsync("C:\\Users\\User1\\VFS\\");
...
// Adds columns to Windows File Manager.
// Show/hide columns in the "More..." context menu on the columns header.
var proDefinitions = storageInfo.StorageProviderItemPropertyDefinitions;
proDefinitions.Add(new StorageProviderItemPropertyDefinition { DisplayNameResource = "Lock Expires", Id = 2, });
proDefinitions.Add(new StorageProviderItemPropertyDefinition { DisplayNameResource = "Lock Scope", Id = 3, });
StorageProviderSyncRootManager.Register(storageInfo);
可以在此處找到完整的注冊示例。
為屬性定義提供數據。 要為列提供數據,您將使用 StorageProviderItemProperties.SetAsync() 調用:
IStorageItem storageItem = await Windows.Storage.StorageFile.GetFileFromPathAsync(path);
StorageProviderItemProperty propState = new StorageProviderItemProperty()
{
Id = 3,
Value = "Exclusive",
IconResource = "C:\\path\\icon.ico" // The optional icon to be displayed in the Status column.
};
await StorageProviderItemProperties.SetAsync(storageItem, new StorageProviderItemProperty[] { propState });
另一種方法是實現IStorageProviderItemPropertySource接口。 它根據您的文件路徑返回屬性。
雲存儲提供商實施。 最后,您將需要一個完整的文件系統實現,為您的文件/文件夾占位符提供數據。 您可以在此處找到 .NET/C# 中的完整示例:
請注意:此答案僅適用於 XP 和 VISTA,已過時
可以使用 Column Handler shell 擴展在 XP 上完成 - 請參見此處: http : //www.codeproject.com/Articles/3747/Explorer-column-handler-shell-extension-in-C#
但是,Vista 及更高版本不支持IColumnHandler
。 在這里你必須實現PropertyHandler
。 請參閱 Windows SDK \\Samples\\winui\\Shell\\AppShellIntegration\\PropertyHandlers
。
每個屬性都由屬性架構 XML 文件描述。 此屬性架構必須使用PSRegisterPropertySchema()
注冊。 屬性處理程序實現IInitializeWithXXX
、 IPropertyStore
和可選的IPropertyStoreCapabilities
。 您必須為要處理的每個文件擴展名注冊實現的CLSID
。
不幸的是,您不能在注冊中使用AllFileSystemObject
或*
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.