Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Yusuf от 29-10-2020, 12:52:07

Название: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 29-10-2020, 12:52:07
Здравствуйте, подскажите кто нибудь пользовался фреймворком Avalonia? Мне его порекомендовали в группе шарпистов, после того как я спросил как забиндить TextBlock который находится в combobox, сказали там легко это делается, я и с wpf мучаюсь думал надо ли еще прыгать на что то новое, а вдруг работать не будет в autocad, вот решил посоветоваться стоит, нет или лучше с wpf мучатся. В обычный комбобох получается забиндить, пользовался примерыми которые тут были, но хотел в  один комбобох вывести название атрибута блока и рядом его значение, вот не знаю как сделать, это кажется уже 2 вопрос получился
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 29-10-2020, 13:03:29
И в чём там сложность?
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 29-10-2020, 13:05:10
И в чём там сложность?
где в wpf? не могу забиндить в текстблок данные который находится в комбобох
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 29-10-2020, 13:10:46
И в чём там сложность?
где в wpf? не могу забиндить в текстблок данные который находится в комбобох
Интерфейс строится динамически? Как я понимаю, ты что-то выбираешь в ComboBox, а это отображается в TextBlock?
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 29-10-2020, 13:13:20
Интерфейс строится динамически? Как я понимаю, ты что-то выбираешь в ComboBox, а это отображается в TextBlock?
данные в комбобок должны попадать как пользователь выберет блок, нет в комбобоксе техтблок, вот так

Код - C# [Выбрать]
  1.  <ComboBox Grid.Column="1"
  2.                   Name="ComboBox2"
  3.                   ItemsSource="{Binding DataContext.Tags,
  4.                                RelativeSource={RelativeSource AncestorType=ComboBox}}" Height="40" >
  5.             <ComboBox.ItemTemplate>
  6.                 <DataTemplate>
  7.                     <Border BorderBrush="LightYellow" BorderThickness="1.5" Width="{Binding ElementName=ComboBox2, Path=Width}" >
  8.                         <StackPanel Orientation="Vertical">
  9.                             <StackPanel Orientation="Horizontal">
  10.                                 <TextBlock FontWeight="Thin">Атрибут:</TextBlock>
  11.                                 <TextBlock FontWeight="Bold" Text="{Binding }" ></TextBlock>
  12.                             </StackPanel>
  13.                             <StackPanel Orientation="Horizontal">
  14.                                 <TextBlock FontWeight="Thin">Значение:</TextBlock>
  15.                                 <TextBlock FontWeight="Bold" Text="{Binding }"></TextBlock>
  16.                             </StackPanel>
  17.                         </StackPanel>
  18.                     </Border>
  19.                 </DataTemplate>
  20.             </ComboBox.ItemTemplate>
  21.         </ComboBox>
  22.  
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 29-10-2020, 13:26:07
Интерфейс строится динамически? Как я понимаю, ты что-то выбираешь в ComboBox, а это отображается в TextBlock?
данные в комбобок должны попадать как пользователь выберет блок, нет в комбобоксе техтблок, вот так

Код - C# [Выбрать]
  1.  <ComboBox Grid.Column="1"
  2.                   Name="ComboBox2"
  3.                   ItemsSource="{Binding DataContext.Tags,
  4.                                RelativeSource={RelativeSource AncestorType=ComboBox}}" Height="40" >
  5.             <ComboBox.ItemTemplate>
  6.                 <DataTemplate>
  7.                     <Border BorderBrush="LightYellow" BorderThickness="1.5" Width="{Binding ElementName=ComboBox2, Path=Width}" >
  8.                         <StackPanel Orientation="Vertical">
  9.                             <StackPanel Orientation="Horizontal">
  10.                                 <TextBlock FontWeight="Thin">Атрибут:</TextBlock>
  11.                                 <TextBlock FontWeight="Bold" Text="{Binding }" ></TextBlock>
  12.                             </StackPanel>
  13.                             <StackPanel Orientation="Horizontal">
  14.                                 <TextBlock FontWeight="Thin">Значение:</TextBlock>
  15.                                 <TextBlock FontWeight="Bold" Text="{Binding }"></TextBlock>
  16.                             </StackPanel>
  17.                         </StackPanel>
  18.                     </Border>
  19.                 </DataTemplate>
  20.             </ComboBox.ItemTemplate>
  21.         </ComboBox>
  22.  
Ты читал про MVVM? Делай промежуточный класс и запихивай его в .DataContext. Либо гугли DataContext WPF.
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 29-10-2020, 13:39:15
Ты читал про MVVM? Делай промежуточный класс и запихивай его в .DataContext. Либо гугли DataContext WPF.
да читал, не получается в предыдущий забиндить вот в такой обычный комбобокс вывожу данные
Код - C# [Выбрать]
  1. <ComboBox Margin="5,0" ItemsSource="{Binding LayerNames}" SelectedItem="{Binding SelectedNameIn}"/>
  2.  
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 29-10-2020, 13:52:51
У тебя какая задача? Когда выбираешь блок, то в ComboBox записываются все атрибуты и их значения?
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 29-10-2020, 14:13:35
У тебя какая задача? Когда выбираешь блок, то в ComboBox записываются все атрибуты и их значения?
да в одном комбобоксе Атрибут и Значение, как на картинке

(https://i.postimg.cc/qtrd8RTG/image.png) (https://postimg.cc/qtrd8RTG)

записываю в комбобокс так
Код - C# [Выбрать]
  1. List<AttCombo> combolist = new List<AttCombo>();
  2.  
  3.             combolist.Add(new AttCombo("odin","1"));
  4.             combolist.Add(new AttCombo("два", "2"));
  5.  
  6.             ComboBox2.ItemsSource = combolist;
  7.  
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Дмитрий Загорулькин от 29-10-2020, 14:14:27
Как я понял, Avalonia используется для кроссплатформенной разработки. То есть, там, где применить WPF нет возможности. Какой прок от неё в разработке под AutoCAD?
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 29-10-2020, 14:22:09
У тебя какая задача? Когда выбираешь блок, то в ComboBox записываются все атрибуты и их значения?
да в одном комбобоксе Атрибут и Значение, как на картинке

(https://i.postimg.cc/qtrd8RTG/image.png) (https://postimg.cc/qtrd8RTG)

записываю в комбобокс так
Код - C# [Выбрать]
  1. List<AttCombo> combolist = new List<AttCombo>();
  2.  
  3.             combolist.Add(new AttCombo("odin","1"));
  4.             combolist.Add(new AttCombo("два", "2"));
  5.  
  6.             ComboBox2.ItemsSource = combolist;
  7.  
А не пробовал в цикле, ну или не в цикле, вот так добавлять?
Код - C# [Выбрать]
  1. ComboBox.Items.Add();
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 29-10-2020, 14:36:16
Как я понял, Avalonia используется для кроссплатформенной разработки. То есть, там, где применить WPF нет возможности. Какой прок от неё в разработке под AutoCAD?
говорят что "Авалония - это сильно улучшенный впф. Так что юзать сильно приятнее и таких проблем нет с биндингом", там же советуют в основном исходя  из за своей специфики, вот поэтому здесь решил спросить, потому что при wpf у меня сейчас проблема подлюкчения внешнего стиля т.е не могу засунуть в библиотеку, а в обычном приложении работает, в autocad ошибку выводит, отключаю стиль окно появляется.

А не пробовал в цикле, ну или не в цикле, вот так добавлять?
попробобовал, теперь collections выводит, проблема в том как записать нужные свойства в нужный текстблок
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 29-10-2020, 15:11:09
Код - C# [Выбрать]
  1. using System.Collections.ObjectModel;
  2. using System.Linq;
  3. using System.Windows;
  4.  
  5. namespace WpfApp1
  6. {
  7.     public partial class MainWindow : Window
  8.     {
  9.         public MainWindow()
  10.         {
  11.             InitializeComponent();
  12.             ObservableCollection<Node> nodes = new ObservableCollection<Node>();
  13.             string[] names = { "First", "Second", "Third", "Forth", "Fifth", "Sixth", "Seventh" };
  14.             int[] values = { 1, 2, 3, 4, 5, 6, 7 };
  15.             for (int i=0; i<names.Count(); i++)
  16.             {
  17.                 Node node = new Node
  18.                 {
  19.                     AttributeName = $"Attribute Name: {names[i]}",
  20.                     AttributeValue = $"Attribute Value: {values[i]}"
  21.                 };
  22.                 nodes.Add(node);
  23.             }
  24.             cb.ItemsSource = nodes;
  25.         }
  26.     }
  27.  
  28.     public class Node
  29.     {
  30.         public string AttributeName { get; set; }
  31.         public string AttributeValue { get; set; }
  32.     }
  33. }

Код - XML [Выбрать]
  1. <Window x:Class="WpfApp1.MainWindow"
  2.        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.        xmlns:local="clr-namespace:WpfApp1"
  7.        mc:Ignorable="d"
  8.        Title="MainWindow"
  9.        Height="Auto"
  10.        Width="Auto"
  11.        SizeToContent="WidthAndHeight">
  12.     <Grid>
  13.         <ComboBox Name="cb"
  14.                  SelectedIndex="0">
  15.             <ComboBox.ItemTemplate>
  16.                 <DataTemplate>
  17.                     <Grid>
  18.                         <Grid.RowDefinitions>
  19.                             <RowDefinition Height="*"/>
  20.                             <RowDefinition Height="*"/>
  21.                         </Grid.RowDefinitions>
  22.                         <TextBlock Grid.Row="0"
  23.                                   Text="{Binding Path=AttributeName}"/>
  24.                         <TextBlock Grid.Row="1"
  25.                                   Text="{Binding Path=AttributeValue}"/>
  26.                     </Grid>
  27.                 </DataTemplate>
  28.             </ComboBox.ItemTemplate>
  29.         </ComboBox>
  30.     </Grid>
  31. </Window>

Попробуй вот такой способ
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Привалов Дмитрий от 29-10-2020, 16:09:58
Какой прок от неё в разработке под AutoCAD?
Если не путаю, она в первую очередь упрощает создание сложных интерфейсов, и с помощью ее был написан SharpDevelop.
Просто надстройка над WPF уменьшающая количество кода.
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 29-10-2020, 16:34:55
Lemieux, спасибо получилось, вот хорошо что есть такие форумы, а то одному тяжело разбираться, столько времени потратил, со вчерашнего для сидел, подскажите а как стиль подключить autocad ругается на
Style="{StaticResource VS2012WindowStyle}"
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Дмитрий Загорулькин от 29-10-2020, 17:03:50
Просто надстройка над WPF уменьшающая количество кода.
Она не может быть надстройкой над WPF, потому что работает там, где WPF недоступен.
Цитировать
Если вы знакомы с WPF или UWP, то с Avalonia вы должны чувствовать себя как дома. Хотя Avalonia не совместим по API ни с одной из этих сред (и поэтому элементы управления не могут использоваться без портирования), между ними много общего.
Перевод с помощью гугл-переводчика, оригинал тут: https://avaloniaui.net/docs
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Дмитрий Загорулькин от 29-10-2020, 17:14:51
говорят что "Авалония - это сильно улучшенный впф. Так что юзать сильно приятнее и таких проблем нет с биндингом"
А какие проблемы в WPF с биндингом?
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 29-10-2020, 17:32:35
Lemieux, спасибо получилось, вот хорошо что есть такие форумы, а то одному тяжело разбираться, столько времени потратил, со вчерашнего для сидел, подскажите а как стиль подключить autocad ругается на
Style="{StaticResource VS2012WindowStyle}"
Что пишет? Ты откуда-то из примера взял эту строчку?
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 30-10-2020, 06:40:53
А какие проблемы в WPF с биндингом?
да замучился с биндингом модели, просто список получалось, а вот оказывается модель надо программно в itemsource записывать, а в xaml  файле прописывать свойства этой модели не смотря на то что Intelisense не подсказывает и выводит эти волнистые линии.

Что пишет? Ты откуда-то из примера взял эту строчку?
не в этом примере, у меня в другом файле есть внешний стиль, ругается так

Извините, вам запрещён просмотр содержимого спойлеров.

может как то его прописывать надо по другому, возможно ли что он в библиотеку не собирается он находится в папке Styles\VS2012 и в xaml прописано xmlns:local="clr-namespace:TransmittalCreator.Styles.VS2012"
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 30-10-2020, 07:57:11
а вот оказывается модель надо программно в itemsource записывать
Не обязательно так делать. Посмотри примеры с DataContext, а так же примеры с базами данных, как там работают с DataContext и кастомным классом Node.



не в этом примере, у меня в другом файле есть внешний стиль, ругается так
Есть подозрение, что ошибка того же рода
https://adn-cis.org/forum/index.php?topic=9820.0
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Дима_ от 30-10-2020, 08:51:58
говорят что "Авалония - это сильно улучшенный впф.
Цитировать
Мне его порекомендовали в группе шарпистов, после того как я спросил как забиндить TextBlock который находится в combobox...
Я бы сказал, что это просто более новый wpf, но еще сырой (DataGrid например). Да там сделали нормальный биндинг команд - просто биндится метод (с моей точки зрения в wpf с этим ICommand перемудрили) и поддержку асинхронности "из коробки". Для автокада я бы его точно сейчас использовать не стал (на основании чего Вам рекомендовали его "шарписты" и в чем проблема биндинга textblock с combobox - это для меня очень странные вопросы). Мое мнение - на сегодня его имеет смысл использовать если только необходимо реализовать GUI в .NetCore. В других случаях я бы сильно посоветовал подождать, с выходом обобщенного .Net (5 или постарше) MS в любом случае придеться выдать реализацию GUI - я не думаю, что это будет релиз WPF (он сильно завязан под нативный Windows, не так конечно как WinForms, но все-же - да и WinForms сильно проще его-как раз можно просто и переписать - но не нужно). Скорее всего "явят", что-то новое с заточкой на все последние "плюшки" C#. Вот тут я допускаю вариант, что это будет выкупленная Avalonia (как поступили с Xamarin например) либо-же, что-то новое.
Переписывать под Core WPF смысла нет. Часть концепций уже устаревает - а вкладывать огромные ресурсы в получение того-же, да еще и с репутационными рисками (100% найдется, то что будет работать не так как в оригинале - сразу "недалекие" доброжелатели начнут комментировать - что даже переписать свое старое не можете). Вот тогда и можно смотреть, что изучать - а сейчас, я бы рекомендовал разобраться с WPF и не хватать то, что блестит - голова не резиновая, хвататься за все новые "фишки" - непозволительная роскошь - если только совсем от безделья.
Разработать полноценный GUI - это "дорогое" удовольствие, да в Avalon'ии есть принципиальные "штрихи", которые почти наверняка будут в следующей реализации выпущенной, или рекомендуемой к юзанию GUI от MS (там используется те технологии которые последовательно внедряют в мейнстрим) - подход данный кстати очень продуманный (эволюционный - за последние 10 лет С# превратили в F# только с Си подобным синтаксисом и плавно "повыкидывали" все лишнее - нет все осталось, но так уже никто не пишет).
В общем не торопитесь.
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 30-10-2020, 09:10:04
Кстати. Кастомный стиль окна я делаю по другому. Я сделал безрамочное WPF окно, настроил его так, чтобы повторяло окно из AutoCAD и можно было его перемещать, а туда вставляю UserControl.
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Yusuf от 30-10-2020, 09:14:57
Вот тогда и можно смотреть, что изучать - а сейчас, я бы рекомендовал разобраться с WPF и не хватать то, что блестит - голова не резиновая, хвататься за все новые "фишки" - непозволительная роскошь - если только совсем от безделья.
вот поэтому решил тут спросить, спасибо за подробный ответ.

Кстати. Кастомный стиль окна я делаю по другому. Я сделал безрамочное WPF окно, настроил его так, чтобы повторяло окно из AutoCAD и можно было его перемещать, а туда вставляю UserControl.
можно поподробней как сделать чтобы повторяло стиль окна autocad
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 30-10-2020, 09:16:39
можно поподробней как сделать чтобы повторяло стиль окна autocad
Буду дома, скину пример.
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Привалов Дмитрий от 30-10-2020, 10:35:24
Она не может быть надстройкой над WPF, потому что работает там, где WPF недоступен.
Возможно написали с нуля, используя подход WPF и устраняя узкие места.

Так с многими API, языками, софтом происходит. Когда начинают ими пользоваться находится куча "узких мест". Решается либо plugins, либо пишут свой API, работающий поверх существующего, либо переписывают с нуля.

Узкие места, это обычно:
1. Низкая производительность в каких-то сценариях
2. Недостаточность функционала
3. Избыточность кода для типовых сценариев.
Название: Re: Avalonia или wpf c autocad net api
Отправлено: Lemieux от 30-10-2020, 17:40:15
можно поподробней как сделать чтобы повторяло стиль окна autocad

Код - XML [Выбрать]
  1. <Window x:Class="PowerSystemProtection.Windows.Palette_Set"
  2.        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.        xmlns:local="clr-namespace:PowerSystemProtection.Windows"
  7.        mc:Ignorable="d"
  8.        Height="Auto"
  9.        Width="Auto"
  10.        WindowStyle="None"
  11.        PreviewKeyDown="HandleEsc"
  12.        AllowsTransparency="True"
  13.        ShowInTaskbar="False"
  14.        Background="Transparent"
  15.        BorderBrush="Transparent"
  16.        Foreground="Transparent"
  17.        ResizeMode="NoResize"
  18.        FontFamily="GOST Type B"
  19.        FontSize="14"
  20.        SizeToContent="WidthAndHeight">
  21.     <Grid Background="#00000000">
  22.         <Grid.ColumnDefinitions>
  23.             <ColumnDefinition Width="3" />
  24.             <ColumnDefinition Width="3" />
  25.             <ColumnDefinition Width="Auto" />
  26.             <ColumnDefinition Width="3" />
  27.             <ColumnDefinition Width="21" />
  28.         </Grid.ColumnDefinitions>
  29.         <Grid.RowDefinitions>
  30.             <RowDefinition Height="3" />
  31.             <RowDefinition Height="3" />
  32.             <RowDefinition Height="Auto" />
  33.             <RowDefinition Height="3" />
  34.             <RowDefinition Height="3" />
  35.         </Grid.RowDefinitions>
  36.         <Rectangle Grid.Column="0"
  37.                   Grid.ColumnSpan="5"
  38.                   Grid.Row="0"
  39.                   Grid.RowSpan="5"
  40.                   Fill="#FF2E3440"
  41.                   Stroke="#FF222933"
  42.                   RadiusX="3"
  43.                   RadiusY="3"
  44.                   MouseDown="DragAndMove"/>
  45.         <Rectangle Grid.Column="1"
  46.                   Grid.ColumnSpan="3"
  47.                   Grid.Row="1"
  48.                   Grid.RowSpan="3"
  49.                   Fill="#FF2E3440"
  50.                   Stroke="#FF222933"
  51.                   RadiusX="3"
  52.                   RadiusY="3"/>
  53.         <DockPanel Grid.Column="4"
  54.                   Grid.Row="0"
  55.                   Grid.RowSpan="5"
  56.                   MouseDown="DragAndMove"
  57.                   Background="#00000000">
  58.             <Button x:Name="close_button"
  59.                    HorizontalAlignment="Center"
  60.                    VerticalAlignment="Top"
  61.                    DockPanel.Dock="Top"
  62.                    Background="Transparent"
  63.                    BorderBrush="Transparent"
  64.                    Foreground="Transparent"
  65.                    Width="12"
  66.                    Height="12"
  67.                    RenderTransformOrigin="0.5,0.5"
  68.                    Click="CloseWindow"
  69.                    Margin="0,7,0,0">
  70.                 <Button.Style>
  71.                     <Style TargetType="{x:Type Button}">
  72.                         <Setter Property="Template">
  73.                             <Setter.Value>
  74.                                 <ControlTemplate TargetType="{x:Type Button}">
  75.                                     <Grid Background="{TemplateBinding Background}">
  76.                                         <ContentPresenter HorizontalAlignment="Center"
  77.                                                          VerticalAlignment="Center" />
  78.                                     </Grid>
  79.                                 </ControlTemplate>
  80.                             </Setter.Value>
  81.                         </Setter>
  82.                     </Style>
  83.                 </Button.Style>
  84.                 <Button.RenderTransform>
  85.                     <TransformGroup>
  86.                         <RotateTransform Angle="45" />
  87.                     </TransformGroup>
  88.                 </Button.RenderTransform>
  89.                 <Canvas HorizontalAlignment="Center"
  90.                        VerticalAlignment="Center"
  91.                        Width="12"
  92.                        Height="12">
  93.                     <Grid>
  94.                         <Grid.ColumnDefinitions>
  95.                             <ColumnDefinition Width="1" />
  96.                             <ColumnDefinition Width="1" />
  97.                             <ColumnDefinition Width="1" />
  98.                             <ColumnDefinition Width="1" />
  99.                             <ColumnDefinition Width="1" />
  100.                             <ColumnDefinition Width="1" />
  101.                             <ColumnDefinition Width="1" />
  102.                             <ColumnDefinition Width="1" />
  103.                             <ColumnDefinition Width="1" />
  104.                             <ColumnDefinition Width="1" />
  105.                             <ColumnDefinition Width="1" />
  106.                             <ColumnDefinition Width="1" />
  107.                         </Grid.ColumnDefinitions>
  108.                         <Grid.RowDefinitions>
  109.                             <RowDefinition Height="1" />
  110.                             <RowDefinition Height="1" />
  111.                             <RowDefinition Height="1" />
  112.                             <RowDefinition Height="1" />
  113.                             <RowDefinition Height="1" />
  114.                             <RowDefinition Height="1" />
  115.                             <RowDefinition Height="1" />
  116.                             <RowDefinition Height="1" />
  117.                             <RowDefinition Height="1" />
  118.                             <RowDefinition Height="1" />
  119.                             <RowDefinition Height="1" />
  120.                             <RowDefinition Height="1" />
  121.                         </Grid.RowDefinitions>
  122.                         <Rectangle Grid.Column="0"
  123.                                   Grid.ColumnSpan="12"
  124.                                   Grid.Row="5"
  125.                                   Grid.RowSpan="2"
  126.                                   Fill="#bec0c5"
  127.                                   RadiusX="1"
  128.                                   RadiusY="1" />
  129.                         <Rectangle Grid.Column="5"
  130.                                   Grid.ColumnSpan="2"
  131.                                   Grid.Row="0"
  132.                                   Grid.RowSpan="12"
  133.                                   Fill="#bec0c5"
  134.                                   RadiusX="1"
  135.                                   RadiusY="1" />
  136.                     </Grid>
  137.                 </Canvas>
  138.             </Button>
  139.             <Image VerticalAlignment="Bottom"
  140.                   x:Name="image"
  141.                   Margin="0,0,1,2"
  142.                   DockPanel.Dock="Bottom"
  143.                   Width="16"
  144.                   Height="16"/>
  145.             <TextBlock x:Name="text_block"
  146.                       DockPanel.Dock="Bottom"
  147.                       VerticalAlignment="Bottom"
  148.                       RenderTransformOrigin="0.5,0.5"
  149.                       HorizontalAlignment="Center"
  150.                       Foreground="#bec0c5"
  151.                       Margin="2,0,0,10"
  152.                       TextOptions.TextFormattingMode="Display"
  153.                       FontFamily="Segoe UI">
  154.                 <TextBlock.LayoutTransform>
  155.                     <RotateTransform Angle="270" />
  156.                 </TextBlock.LayoutTransform>
  157.             </TextBlock>
  158.         </DockPanel>
  159.         <Grid Grid.Column="2"
  160.              Grid.ColumnSpan="1"
  161.              Grid.Row="2"
  162.              Grid.RowSpan="1"
  163.              x:Name="host_grid"
  164.              Background="White">
  165.         </Grid>
  166.     </Grid>
  167. </Window>

Код - C# [Выбрать]
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Input;
  4. using System.Windows.Media.Imaging;
  5. using App = Autodesk.AutoCAD.ApplicationServices.Core.Application;
  6.  
  7. namespace PowerSystemProtection.Windows
  8. {
  9.     public partial class Palette_Set : Window
  10.     {
  11.         public string IconSource { get; set; } = "";
  12.         public string TitlePalette { get; set; } = "";
  13.         public bool IsEnableCloseButton { get; set; } = true;
  14.         public bool ModalWindow { get; set; } = true;
  15.         public bool IsActivated { get; set; } = true;
  16.  
  17.         public Palette_Set(UIElement userControl)
  18.         {
  19.             InitializeComponent();
  20.             host_grid.Children.Add(userControl);
  21.         }
  22.  
  23.         public void ShowPalette()
  24.         {
  25.             if (IconSource == "")
  26.                 image.Visibility = Visibility.Collapsed;
  27.             else
  28.                 image.Source = new BitmapImage(new Uri(IconSource, UriKind.Relative));
  29.  
  30.             if (TitlePalette == "")
  31.                 text_block.Visibility = Visibility.Collapsed;
  32.             else
  33.                 text_block.Text = TitlePalette;
  34.  
  35.             close_button.Visibility = IsEnableCloseButton ? Visibility.Visible : Visibility.Hidden;
  36.  
  37.             if (ModalWindow)
  38.                 App.ShowModalWindow(this);
  39.             else
  40.                 App.ShowModelessWindow(this);
  41.  
  42.             ShowActivated = IsActivated;
  43.         }
  44.  
  45.         private void CloseWindow(object sender, RoutedEventArgs e)
  46.         {
  47.             Close();
  48.         }
  49.  
  50.         private void DragAndMove(object sender, MouseButtonEventArgs e)
  51.         {
  52.             DragMove();
  53.         }
  54.  
  55.         private void HandleEsc(object sender, KeyEventArgs e)
  56.         {
  57.             if (e.Key == Key.Escape)
  58.                 Close();
  59.         }
  60.     }
  61. }

Это шаблон для окна, на 100% не повторяет окно палитры, нет кнопки свёртывания и параметров. У него автоизменение ширины/высоты, которое подстраивается под UserControl. Можно вызывать модально и не модально.