5

Эксперименты с XAML в 1С 7.7/8.0/8.1/8.2

by Elisy 15. June 2009 12:51

Пример из этой статьи демонстрирует использование языка XAML, входящего в состав Windows Presentation Foundation (WPF). Как и раньше, для обращения к .Net Framework из 1C используется внешний компонент Elisy .Net Bridge. Его можно скачать разработчикам 1С из Интернет бесплатно.

XAML (eXtensible Application Markup Language) – язык описания интерфейсов нового поколения, позволяет, прежде всего, описывать пользовательский интерфейс. XAML включает в себя группы элементов, среди которых есть: панели, элементы управления, графические фигуры.

Пример, приведенный ниже, загружает необходимые сборки через LoadAssembly. Формирует XML-строку с XAML-конструкциями windowXaml. Статический метод Load класса XamlReader загружает XML-строку через промежуточные переменные stringReader и xmlReader.

Чтобы диалоговая форма корректно отображалась в 1С, свойству Owner присваивается ссылка на главное окно 1С. Данная конструкция работает, начиная с Elisy .Net Bridge 2.2, в котором добавлена поддержка IntPtr. Если у вас версия 2.0/2.1 закомментируйте этот код, пример будет работать, но возможны сторонние эффекты, когда меняется активность окон между диалогом и основной формой 1С.

Последняя строка запускает XAML-форму в модальном режиме. Интересно смотрится форма в немодальном режиме. Для этого нужно использовать вызов

result = window.ShowDialog();

Если кому-то интересно продолжить изучение, рекомендую самостоятельно исследовать XAML-анимацию и визуальные эффекты – самые сильные стороны XAML по сравнению с традиционным описанием интерфейсов.

AttachAddIn("AddIn.ElisyNetBridge");
AddIn = New("AddIn.ElisyNetBridge");
net = AddIn.New("Elisy.NetBridge", "Elisy.ElisyNetBridge");

net.LoadAssembly("System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
net.LoadAssembly("PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

windowXaml="<Window
| xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
| xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
| Title=""Отступы""
| Height=""190""
| Width=""300""
| MinHeight=""10""
| MinWidth=""300""
| ResizeMode=""CanResizeWithGrip""
| ShowInTaskbar=""False""
| WindowStartupLocation=""CenterOwner""
| FocusManager.FocusedElement=""{Binding ElementName=leftMarginTextBox}"">
|
| <Grid>
| <Grid.Resources>
| <Style TargetType=""{x:Type Grid}"">
| <Setter Property=""Margin"" Value=""10"" />
| </Style>
| <Style TargetType=""{x:Type Label}"">
| <Setter Property=""Margin"" Value=""0,3,5,5"" />
| <Setter Property=""Padding"" Value=""0,0,0,5"" />
| </Style>
| <Style TargetType=""{x:Type TextBox}"">
| <Setter Property=""Margin"" Value=""0,0,0,5"" />
| <Style.Triggers>
| <Trigger Property=""Validation.HasError"" Value=""true"">
| <Setter Property=""ToolTip"" Value=""{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}""/>
| </Trigger>
| </Style.Triggers>
| </Style>
| <Style TargetType=""{x:Type StackPanel}"">
| <Setter Property=""Orientation"" Value=""Horizontal"" />
| <Setter Property=""HorizontalAlignment"" Value=""Right""/>
| </Style>
| <Style TargetType=""{x:Type Button}"">
| <Setter Property=""Width"" Value=""70"" />
| <Setter Property=""Height"" Value=""25"" />
| <Setter Property=""Margin"" Value=""5,0,0,0"" />
| </Style>
| </Grid.Resources>
|
| <Grid.ColumnDefinitions>
| <ColumnDefinition Width=""Auto"" />
| <ColumnDefinition />
| </Grid.ColumnDefinitions>
|
| <Grid.RowDefinitions>
| <RowDefinition Height=""Auto"" />
| <RowDefinition Height=""Auto"" />
| <RowDefinition Height=""Auto"" />
| <RowDefinition Height=""Auto"" />
| <RowDefinition Height=""Auto"" />
| <RowDefinition />
| </Grid.RowDefinitions>
|
| <Label Grid.Column=""0"" Grid.Row=""0"">Левый отступ:</Label>
| <TextBox Name=""leftMarginTextBox"" Grid.Column=""1"" Grid.Row=""0"">
| </TextBox>
| <Label Grid.Column=""0"" Grid.Row=""1"">Верхний отступ:</Label>
| <TextBox Name=""topMarginTextBox"" Grid.Column=""1"" Grid.Row=""1"">
| </TextBox>
| <Label Grid.Column=""0"" Grid.Row=""2"">Правый отступ:</Label>
| <TextBox Name=""rightMarginTextBox"" Grid.Column=""1"" Grid.Row=""2"">
| </TextBox>
| <Label Grid.Column=""0"" Grid.Row=""3"">Нижний отступ:</Label>
| <TextBox Name=""bottomMarginTextBox"" Grid.Column=""1"" Grid.Row=""3"">
| </TextBox>
| <StackPanel Grid.Column=""0"" Grid.ColumnSpan=""2"" Grid.Row=""4"">
| <Button Name=""okButton"" IsDefault=""True"">OK</Button>
| <Button Name=""cancelButton"" IsCancel=""True"">Отмена</Button>
| </StackPanel>
| </Grid >
|</Window>";


stringReader = net.New("System.IO.StringReader", windowXaml);
xmlReader = net.CallStatic("System.Xml.XmlReader", "Create", stringReader);
window = net.CallStatic("System.Windows.Markup.XamlReader", "Load", xmlReader);

//Установить владельца через вспомогательный класс WindowInteropHelper
//Работает, начиная с Elisy .Net Bridge 2.2 и выше
wih = net.New("System.Windows.Interop.WindowInteropHelper", window);
wih.Owner = net.CallStatic("System.Diagnostics.Process", "GetCurrentProcess").MainWindowHandle;

result = window.ShowDialog();

 

Tags:

1C.Net

Comments

Jaza
Jaza
6/21/2009 5:58:54 PM #

Данная конструкция работает

Денис
Денис
6/29/2009 11:59:51 AM #

И почему с 1С постоянно приходиться к всяким извращениям обращаться. Не могут они или не хотят систему оптимизировать?

1c:enterprise
1c:enterprise
6/30/2009 11:49:40 AM #

Хочется пользоваться последними достижениями науки и техники, а 1С не успевает внедрять все это. Вот и приходится исхитряться.

Арсений
Арсений
7/6/2009 2:22:32 PM #

Ребяты, не нужно ругать 1С. Поймити же, это не Борланд и т.д. Им еще надо кормить армию дистрибьютеров со компани.
Если все просто написать, ужас как много народу работу потеряет. Выгодно это фирме? Так что терпим, а кто может,
тот и на хлеб с маслом под шумок зарабатывает.

kolan
kolan
7/30/2009 7:16:50 AM #

И здесь не все просто

Powered by BlogEngine.NET 1.6.0.0
Original Design by Laptop Geek, Adapted by onesoft

Indonesia Furniture Handicraft Wholesale Marketplace : Bisnis Online Rahasia Dahsyat Hidup Sukses dan Uang Melimpah : Travelling : Salehdbrent Sgdashhousedotcom : Used Stationary Bikes : Salehdbrent Sgdashhousedotcom : Used Stationary Bikes : Used Stationary Bikes : Travel Jakarta Bandung: Blogger Indonesia Dukung Internet Aman, Sehat & Manfaat : Hosting Murah Indonesia Indositehost.com : Indonesia Furniture Handicraft Wholesale Marketplace