Перейти к содержанию

Запрет добавления файлов в один из файловых контролов

Запрет добавления файлов в один из файловых контролов

Предложена следующая задача: в некоторые заранее определённые файловые контролы надо запретить любое добавление файлов, в то время как в других контролах возможность добавления по-прежнему опирается на права доступа. Такие файловые контролы, доступные только для чтения, можно использовать для отображения файлов особых категорий или для виртуальных файлов.

Для удобной настройки файловых контролов, доступных для чтения, определим, что их алиас должен заканчиваться на суффикс _readonly. Например, MyFileControl_readonly.

Для этого сначала скрываем пункты контекстного меню через расширение FileControlExtension. Пишем наследник класса, который регистрируется по интерфейсу IFileControlExtension и с указанием WithOrder(ExtensionStage.AfterPlatform). На момент выполнения метода расширения OpeningMenu все платформенные пункты меню уже добавлены в context.Actions, их достаточно скрыть через свойство IsCollapsed.

using System; using System.Threading.Tasks; using Tessa.Extensions; using Tessa.UI.Files;

public sealed class ReadOnlyFileControlExtension : FileControlExtension { private static readonly string[] addFileActionNames = { FileMenuActionNames.Upload, FileMenuActionNames.Scan, FileMenuActionNames.PasteFromClipboard, FileMenuActionNames.AddFromTemplate, FileMenuActionNames.Separator1, };

public override Task OpeningMenu(IFileControlExtensionContext context) { if (context.Control.Name?.EndsWith("_readonly", StringComparison.OrdinalIgnoreCase) == true) { foreach (string actionName in addFileActionNames) { context.Actions[actionName].IsCollapsed = true; } }

return Task.CompletedTask; } }

[Registrator] public sealed class Registrator : RegistratorBase { public override void RegisterExtensions(IExtensionContainer extensionContainer) { extensionContainer .RegisterExtension<IFileControlExtension, ReadOnlyFileControlExtension>(x => x .WithOrder(ExtensionStage.AfterPlatform, 1) .WithSingleton()); } }

Для запрета фактического добавления файлов в контрол, что важно для перетаскивание файлов через drag&drop, добавим расширение на карточки CardUIExtension, которое установит обработчик ContainerFileAdding и отменит добавление любых файлов в этот контрол.

using System; using System.Threading.Tasks; using Tessa.Extensions; using Tessa.UI.Cards;

public sealed class ReadOnlyFileControlCardUIExtension : CardUIExtension { public override Task Initialized(ICardUIExtensionContext context) { context.FileContainer.ContainerFileAdding += (s, e) => { if (e.Control.Name?.EndsWith("_readonly", StringComparison.OrdinalIgnoreCase) == true) { e.Cancel = true; } };

return Task.CompletedTask; } }

[Registrator] public sealed class Registrator : RegistratorBase { public override void RegisterExtensions(IExtensionContainer extensionContainer) { extensionContainer .RegisterExtension<ICardUIExtension, ReadOnlyFileControlCardUIExtension>(x => x .WithOrder(ExtensionStage.AfterPlatform, 1) .WithSingleton()); } }

Back to top