Программирование >>  Дополнения add-ins 

1 ... 3 4 5 [ 6 ] 7


Класс CalculatorContractToViewHostAdapter реализует методы абстрактного класса представления хоста Calculator и переадресует вызов контракту. Опять-таки, вы можете видеть ContractHandle, хранящий ссылку на контракт, что подобно преобразованиям типа адаптера стороны дополнения. На этот раз преобразование типа идет в другом направлении, чем в случае адаптера дополнения.

Атрибут HostAdapter помечает класс как адаптер, который должен быть инсталлирован в каталоге HostSideAdapters.

using System.Collections.Generic; using System.AddIn.Pipeline; namespace Wrox.ProCSharp.AddIns

[HostAdapter]

internal class CalculatorContractToViewHostAdapter : Calculator {

private ICalculatorContract contract; private ContractHandle handle;

public CalculatorContractToViewHostAdapter(ICalculatorContract contract)

this.contract = contract;

handle = new ContractHandle(contract);

public override IList<Operation> GetOperations()

return CollectionAdapters.ToIList<IOperationContract, Operation> ( contract.GetOperations(),

OperationHostAdapters.ContractToViewAdapter, OperationHostAdapters.ViewToContractAdapter);

public override double Operate(Operation operation, double[] operands)

return contract.Operate(OperationHostAdapters.ViewToContractAdapter( operation), operands);

Хост калькулятора

Простое принимающее хост-приложение использует технологию WPF. Вы можете видеть пользовательский интерфейс этого приложения на рис. 36.3. Вверху находится список доступных дополнений. Слева - операции активного дополнения. Когда вы выбираете операцию, которая должна быть вызвана, отображаются операнды. После ввода значений операндов может быть вызвана операция дополнения.

Кнопки в нижнем ряду используются для перестройки и обновления хранилища дополнений и для выхода из приложения.

Код XAML, приведенный ниже, демонстрирует дерево объектов пользовательского интерфейса. С элементами ListBox используются разные стили шаблонов, чтобы дать специфическое представление списка дополнений, списка операций и списка операндов.


Рис. 36.3. Хост калькулятора



Информацию о шаблонах элементов вы найдете в главе 35.

<DockPanel>

<GroupBox Header= AddIn Store DockPanel.Dock= Bottom > <UniformGrid Columns= 4 > <Button x:Name= rebuildStore Click= RebuildStore

Margin= 5 > Rebuild </Button> <Button x:Name= updateStore Click= UpdateStore

Margin= 5 > Update </Button>

<Button x:Name= refresh Click= RefreshAddIns

Margin= 5 > Refresh </Button> <Button x:Name= exit Click= App Exit Margin= 5 > Exit </Button> </UniformGrid>

</GroupBox>

<GroupBox Header= AddIns DockPanel.Dock= Top >

<ListBox x:Name= listAddIns ItemsSource= {Binding}

Style= {StaticResource listAddInsStyle} /> </GroupBox>

<GroupBox DockPanel.Dock= Left Header= Operations >

<ListBox x:Name= listOperations ItemsSource= {Binding}

Style= {StaticResource listOperationsStyle} />

</GroupBox>

<StackPanel DockPanel.Dock= Right Orientation= Vertical > <GroupBox Header= Operands > <ListBox x:Name= listOperands ItemsSource= {Binding}

Style= {StaticResource listOperandsStyle} > </ListBox>

</GroupBox>

<Button x:Name= buttonCalculate Click= Calculate IsEnabled= False

Margin= 5 > Calculate </Button> <GroupBox DockPanel.Dock= Bottom Header= Result > <Label x:Name= labelResult />

</GroupBox>

</StackPanel> </DockPanel>

В приведенном ниже коде метод FindAddIns() вызывается в конструкторе Window. Метод FindAddIns() использует класс AddInStore для получения коллекции объектов AddInToken и передачи их свойству DataContext элемента ListBox по имени listAddIns для отображения. Первый параметр метода AddInStore.FindAddIns() передает абстрактный класс Calculator, определенный представлением хоста, чтобы найти все дополнения из хранилища, применимые к контракту. Второй параметр передает каталог канала, прочитанный из конфигурационного файла приложения. В примере приложения, доступном на прилагаемом компакт-диске, вы должны изменить каталог в конфигурационном файле приложения, чтобы он соответствовал вашей структуре каталогов.

using System;

using System.AddIn.Hosting; using System.AddIn.Pipeline; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; using Wrox.ProCSharp.AddIns.Properties; namespace Wrox.ProCSharp.AddIns

public partial class CalculatorHostWindow : Window {

private Calculator activeAddIn = null;



private Operation currentOperation = null; public CalculatorHostWindow()

InitializeComponent(); FindAddIns();

void FindAddIns()

try {

this.listAddIns.DataContext =

AddInStore.FindAddIns(typeof(Calculator), Settings.Default.PipelinePath);

catch (DirectoryNotFoundException ex)

MessageBox.Show( Verify the pipeline directory in the +

config file ); Application.Current.Shutdown();

Чтобы обновить кэш хранилища дополнений, методы UpdateStore() и RebuildStore() отображаются на события щелчка на кнопках Update (Обновить) и Rebuild (Перестроить). Внутри реализации этих методов используются методы Rebuild() и Update() класса AddInStore. Эти методы возвращают строковый массив предупреждений, если сборки оказываются в неправильных каталогах. Из-за сложности структуры канала высока вероятность, что у вас не сразу получится правильная конфигурация проекта для копирования сборок в правильные каталоги. Чтение информации, возвращенной этими методами, даст вам ясное объяснение того, что пошло не так. Например, сообщение No usable AddlnAdapter parts could be found in assembly Pipeline\AddInSideAdapters\CalcView.dll ясно указывает на неправильное расположение сборки CalcView.

private void UpdateStore(object sender, RoutedEventArgs e)

string[] messages = AddInStore.Update(Settings.Default.PipelinePath);

if (messages.Length != 0)

MessageBox.Show(string.Join( \n , messages),

AddInStore Warnings , MessageBoxButton.OK, MessageBoxImage.Warning);

private void RebuildStore(object sender, RoutedEventArgs e) {

string[] messages =

AddInStore.Rebuild(Settings.Default.PipelinePath); if (messages.Length != 0) {

MessageBox.Show(string.Join( \n , messages),

AddInStore Warnings , MessageBoxButton.OK, MessageBoxImage.Warning);



1 ... 3 4 5 [ 6 ] 7

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика