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

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

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

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

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

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

using System; 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 void OpeningMenu(IFileControlExtensionContext context) { if (context.Control.Name?.EndsWith("_readonly", StringComparison.OrdinalIgnoreCase) == true) { foreach (string actionName in addFileActionNames) { context.Actions[actionName].IsCollapsed = true; } } } }

[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 Tessa.UI.Cards;

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

[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