Пример из этой статьи демонстрирует использование языка 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();