|
Программирование >> Дополнения add-ins
На рис. 36.3 вы можете видеть рядом со списком доступных дополнений кнопку Activate (Активизировать). Щелчок на этой кнопке вызывает метод-обработчик ActivateAddIn(). При такой реализации дополнение активизируется вызовом метода Activate() класса AddInToken. Здесь дополнение загружается в новый процесс, созданный классом AddInProcess. Этот класс запускает процесс AddInProcess32.exe. Установка свойства KeepAlive процесса в false останавливает процесс, как только сборщик мусора уберет последнюю ссылку на дополнение. Параметр AddInSecurityLevel.Internet устанавливает ограниченные права запускаемому дополнению. Последний оператор ActivateAddIn() вызывает метод LastOperations(), который, в свою очередь, вызывает метод GetOperations() до полнения. GetOperations() присваивает возвращенный список контексту данных ListBox listOperations для отображения всех операций. private void ActivateAddIn(object sender, RoutedEventArgs e) FrameworkElement el = sender as FrameworkElement; Trace.Assert(el != null, ActivateAddIn invoked from the wrong + control type ); AddInToken addIn = el.Tag as AddInToken; Trace.Assert(el.Tag != null, String.Format( An AddInToken must be assigned to the Tag property + of the control {0} , el.Name); AddInProcess process = new AddInProcess(); process.KeepAlive = false; activeAddIn = addIn.Activate<Calculator> (process, AddInSecurityLevel.Internet); ListOperations(); void ListOperations() { this.listOperations.DataContext = activeAddIn.GetOperations(); После активизации дополнения и отображения списка операций в пользовательском интерфейсе, пользователь может выбрать операцию. Событию Click элемента Button, показанного в категории Operations, назначается метод-обработчик OperationSelected(). В его реализации объект Operation, присвоенный свойству Tag элемента Button, извлекается для получения количества операндов, необходимых для выбранной операции. Чтобы позволить пользователю добавлять значения операндам, массив объектов OperandUI привязывается к ListBox listOperations. private void OperationSelected(object sender, RoutedEventArgs e) { FrameworkElement el = sender as FrameworkElement; Trace.Assert(el != null, OperationSelected invoked from + the wrong control type ); Operation op = el.Tag as Operation; Trace.Assert(el.Tag != null, String.Format( An AddInToken must be assigned to the Tag property + of the control {0} , el.Name); currentOperation = op; ListOperands(new double[op.NumberOperands]); private class OperandUI { public int Index { get; set; } public double Value { get; set; } void ListOperands(double[] operands) this.listOperands.DataContext = operands.Select((operand, index) => new OperandUI() { Index = index + 1, Value = operand }).ToArray(); Метод Calculate() вызывается событием Click кнопки Calculate (Вычислить). Здесь операнды извлекаются из пользовательского интерфейса, операция и операнды передаются методу Operate() дополнения, а результат отображается в содержимом метки. private void Calculate(object sender, RoutedEventArgs e) { OperandUI[] operandsUI = (OperandUI[])this.listOperands.DataContext; double[] operands = operandsUI.Select(opui => opui.Value).ToArray(); labelResult.Content = activeAddIn.Operate(currentOperation, operands); Дополнительные дополнения На этом вся трудная работа закончена. Компоненты канала и хост-приложение созданы. Канал работает, и добавление к хост-приложению новых дополнений, таких как Advanced Calculator, показанный в следующем фрагменте кода, становится простой задачей. [AddIn( Advanced Calc , Publisher = Wrox Press , Version = 1.1.0.0 , Description = Another AddIn Sample )] public class AdvancedCalculatorV1 : Calculator Резюме В этой главе были представлены концепции новой технологии .NET 3.5: каркаса управляемых дополнений (Managed Add-In Framework - MAF). MAF использует концепцию канала для обеспечения независимости между сборками принимающего хост-приложения и дополнений. Четко определенный контракт отделяет представление хоста от представления дополнения. Адаптеры обеспечивают возможность обеим сторонам изменяться независимо друг от друга. Следующая глава - первая из трех, посвященных разработке пользовательского интерфейса с ASP.NET.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |