Проблема с WPFDocumentWindow

Автор Тема: Проблема с WPFDocumentWindow  (Прочитано 8942 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн trirАвтор темы

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Проблема с WPFDocumentWindow
« : 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)
« Последнее редактирование: 02-07-2015, 15:13:59 от Виктор Чекалин »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Проблема с WPFDocumentWindow
« Ответ #1 : 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

Оффлайн trirАвтор темы

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Проблема с WPFDocumentWindow
« Ответ #2 : 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.  

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Проблема с WPFDocumentWindow
« Ответ #3 : 02-07-2015, 15:32:58 »
И ещё есть WPF-приложение, где это работает
Тем не менее, сути это не меняет. Сборка MyCheckDBClassLibrary1 недоступна оттуда, где находится ваш UserControl.

Оффлайн trirАвтор темы

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Проблема с WPFDocumentWindow
« Ответ #4 : 07-07-2015, 10:37:55 »
угу, принудительно загрузил сборку через Assembly.LoadFile()

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Проблема с WPFDocumentWindow
« Ответ #5 : 07-07-2015, 10:43:20 »
угу, принудительно загрузил сборку через Assembly.LoadFile()
Костыльное решение.
Если я правильно понимаю, то в солюшене 2 проекта. Добавьте в проект 1 референс на проект 2.

Оффлайн trirАвтор темы

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Проблема с WPFDocumentWindow
« Ответ #6 : 07-07-2015, 10:46:14 »
добавил, копируется локально, но походу Акад ищет подключонную библиотеку у себя в папке, а не в папке исходной библиотеки...

Отмечено как Решение trir 07-07-2015, 11:06:22

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Проблема с WPFDocumentWindow
« Ответ #7 : 07-07-2015, 10:55:29 »
AutoCAD тут не причем. Это поведение .NET, и скорее даже WPF.
Вроде бы у меня была такая ситуация и проблема заключалась в том, что сборка MyCheckDBClassLibrary1 используется только в разметке XAML и по этой причине почему то .NET не мог корректно подхватить файл сборки.
Если я не ошибаюсь, то решением было вызвать использовать любой класс из той сборки в Code Behind, т.е. в .cs файле. Не обязательно что то делать. Можно просто создать класс MyCheckDBClassLibrary1 в конструкторе класса MainWindow.
Решение правда тоже костыльное. Но на мой взгляд лучше чем Assembly.Load

Оффлайн trirАвтор темы

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Проблема с WPFDocumentWindow
« Ответ #8 : 07-07-2015, 11:06:41 »
Спасибо, даже лучше