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

ADN Club => AutoCAD .NET API => Тема начата: trir от 02-07-2015, 15:04:51

Название: Проблема с WPFDocumentWindow
Отправлено: trir от 02-07-2015, 15:04:51
На основе http://through-the-interface.typepad.com/through_the_interface/2014/05/adding-a-wpf-document-tab-in-autocad-2015-using-net.html

Код - C# [Выбрать]
  1.         [CommandMethod("ADW")]
  2.  
  3.         public static void AddDocumentWindow()
  4.         {
  5.             var wc = new UserControl1();
  6.             // Create a WPFDocumentWindow for our content then open it
  7.             var dw = new WPFDocumentWindow(wc);
  8.             dw.Title = "WPF Document Window";
  9.             Application.DocumentWindowCollection.AddDocumentWindow(dw);
  10.  
  11.         }

и XAML
Код - XML [Выбрать]
  1. <UserControl
  2.             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.             xmlns:local="clr-namespace:MyCheckDBClassLibrary1;assembly=MyCheckDBClassLibrary1"
  5.    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6.    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  7.    mc:Ignorable="d" x:Class="CheckAcad2.UserControl1"
  8.             d:DesignWidth="490" d:DesignHeight="341">
  9.     <UserControl.Resources>
  10.         <HierarchicalDataTemplate DataType="{x:Type local:Node}" ItemsSource="{Binding Children}">
  11.             <StackPanel Orientation="Horizontal">
  12.                 <CheckBox IsChecked="{Binding IsChecked}" Uid="{Binding Id}" />
  13.                 <TextBlock Text="{Binding Text}"/>
  14.             </StackPanel>
  15.         </HierarchicalDataTemplate>
  16.         <Style TargetType="{x:Type TreeViewItem}">
  17.             <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
  18.         </Style>
  19.     </UserControl.Resources>
  20.     <DockPanel>
  21.         <Menu DockPanel.Dock="Top">
  22.             <MenuItem Header="Файл" >
  23.                 <MenuItem Header="Открыть" />
  24.             </MenuItem>
  25.             <MenuItem Header="БД" >
  26.                 <MenuItem Header="Загрузить1" />
  27.                 <MenuItem Header="ЗагрузитьDST" />
  28.             </MenuItem>
  29.             <MenuItem Header="Тест" >
  30.                 <MenuItem Header="Тест1" />
  31.                 <MenuItem Header="Тест2" />
  32.             </MenuItem>
  33.         </Menu>
  34.         <StatusBar DockPanel.Dock="Bottom" Height="22">
  35.             <StatusBarItem x:Name="SBI1" Content="StatusBarItem"/>
  36.             <StatusBarItem x:Name="SBI2" Content="StatusBarItem"/>
  37.         </StatusBar>
  38.         <TreeView x:Name="wTree"/>
  39.     </DockPanel>
  40. </UserControl>

Проблема при загрузке UserControl.Resources, если его убрат - всё загружается

Цитировать
************** Текст исключения **************
System.Windows.Markup.XamlParseException: "Задание свойства "System.Windows.ResourceDictionary.DeferrableContent" вызвало исключение.": номер строки "9" и позиция в строке "6". ---> System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "MyCheckDBClassLibrary1, PublicKeyToken=null" либо одну из их зависимостей. Не удается найти указанный файл.
   в System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   в System.Reflection.Assembly.Load(AssemblyName assemblyRef)
   в System.Windows.Baml2006.Baml2006SchemaContext.ResolveAssembly(BamlAssembly bamlAssembly)
   в System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlTypeToType(BamlType bamlType)
   в System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlType(BamlType bamlType, Int16 typeId)
   в System.Windows.Baml2006.Baml2006SchemaContext.GetXamlType(Int16 typeId)
   в System.Windows.Baml2006.Baml2006Reader.Process_ConstructorParameterType()
   в System.Windows.Baml2006.Baml2006Reader.Process_OneBamlRecord()
   в System.Windows.Baml2006.Baml2006Reader.ReadKeys()
   в System.Windows.ResourceDictionary.SetDeferrableContent(DeferrableContent deferrableContent)
   в System.Windows.Baml2006.WpfSharedBamlSchemaContext.<Create_BamlProperty_ResourceDictionary_DeferrableContent>b__168(Object target, Object value)
   в MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)
Название: Re: Проблема с WPFDocumentWindow
Отправлено: Виктор Чекалин от 02-07-2015, 15:21:28
trir, у вас проект и, в конечном итоге сборка, называется MyCheckDBClassLibrary1?

Проблема, как я подозреваю, заключается не в UserControl.Resources, а в DataType="{x:Type local:Node}". А namespace local ссылается на xmlns:local="clr-namespace:MyCheckDBClassLibrary1;assembly=MyCheckDBClassLibrary1" . Отсюда и ошибка.
Нужно убрать имя сборки из неймспейса, так как clr-namespace находится в той же самой сборке. И изменить namespace:MyCheckDBClassLibrary1 на тот, где у вас находится класс Node
Название: Re: Проблема с WPFDocumentWindow
Отправлено: trir от 02-07-2015, 15:25:46
Нет, MyCheckDBClassLibrary1 это другая сборка.
И ещё есть WPF-приложение, где это работает

Код - XML [Выбрать]
  1. <Window x:Class="MainWindow"
  2.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.    xmlns:local="clr-namespace:MyCheckDBClassLibrary1;assembly=MyCheckDBClassLibrary1"
  5.    Title="MainWindow" Height="350" Width="525">
  6.     <Window.Resources>
  7.         <HierarchicalDataTemplate DataType="{x:Type local:Node}" ItemsSource="{Binding Children}">
  8.             <StackPanel Orientation="Horizontal">
  9.                 <CheckBox IsChecked="{Binding IsChecked}" Uid="{Binding Id}" PreviewMouseLeftButtonDown="wOnMouseLeftButtonDown" PreviewKeyDown="wOnKeyDown" />
  10.                 <TextBlock Text="{Binding Text}"/>
  11.             </StackPanel>
  12.         </HierarchicalDataTemplate>
  13.         <Style TargetType="TreeViewItem">
  14.             <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
  15.         </Style>
  16.     </Window.Resources>
  17.     <DockPanel>
  18.         <Menu DockPanel.Dock="Top">
  19.             <MenuItem Header="Файл" >
  20.                 <MenuItem Header="Открыть" Click="MenuItem_Click" />
  21.             </MenuItem>
  22.             <MenuItem Header="БД" >
  23.                 <MenuItem Header="Загрузить1" Click="MI_LoadPaths_Click" />
  24.                 <MenuItem Header="ЗагрузитьDST" Click="MI_Test1_Click" />
  25.             </MenuItem>
  26.             <MenuItem Header="Тест" >
  27.                 <MenuItem Header="Тест1" Click="MI_Test1_Click" />
  28.                 <MenuItem Header="Тест2" Click="MI_Test2_Click" />
  29.             </MenuItem>            
  30.         </Menu>
  31.         <StatusBar DockPanel.Dock="Bottom" Height="22">
  32.             <StatusBarItem Name="SBI1" Content="StatusBarItem"/>
  33.             <StatusBarItem Name="SBI2" Content="StatusBarItem"/>
  34.         </StatusBar>
  35.         <TreeView Name="wTree"/>
  36.     </DockPanel>
  37. </Window>
  38.  
Название: Re: Проблема с WPFDocumentWindow
Отправлено: Виктор Чекалин от 02-07-2015, 15:32:58
И ещё есть WPF-приложение, где это работает
Тем не менее, сути это не меняет. Сборка MyCheckDBClassLibrary1 недоступна оттуда, где находится ваш UserControl.
Название: Re: Проблема с WPFDocumentWindow
Отправлено: trir от 07-07-2015, 10:37:55
угу, принудительно загрузил сборку через Assembly.LoadFile()
Название: Re: Проблема с WPFDocumentWindow
Отправлено: Виктор Чекалин от 07-07-2015, 10:43:20
угу, принудительно загрузил сборку через Assembly.LoadFile()
Костыльное решение.
Если я правильно понимаю, то в солюшене 2 проекта. Добавьте в проект 1 референс на проект 2.
Название: Re: Проблема с WPFDocumentWindow
Отправлено: trir от 07-07-2015, 10:46:14
добавил, копируется локально, но походу Акад ищет подключонную библиотеку у себя в папке, а не в папке исходной библиотеки...
Название: Re: Проблема с WPFDocumentWindow
Отправлено: Виктор Чекалин от 07-07-2015, 10:55:29
AutoCAD тут не причем. Это поведение .NET, и скорее даже WPF.
Вроде бы у меня была такая ситуация и проблема заключалась в том, что сборка MyCheckDBClassLibrary1 используется только в разметке XAML и по этой причине почему то .NET не мог корректно подхватить файл сборки.
Если я не ошибаюсь, то решением было вызвать использовать любой класс из той сборки в Code Behind, т.е. в .cs файле. Не обязательно что то делать. Можно просто создать класс MyCheckDBClassLibrary1 в конструкторе класса MainWindow.
Решение правда тоже костыльное. Но на мой взгляд лучше чем Assembly.Load
Название: Re: Проблема с WPFDocumentWindow
Отправлено: trir от 07-07-2015, 11:06:41
Спасибо, даже лучше