передача значений переменных из проекта WPF

Автор Тема: передача значений переменных из проекта WPF  (Прочитано 24817 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
есть тестовое окно WPF при нажатии на кнопку TEXBLOCK получает некоторое значение (45 к примеру) непонятка состоит в том как из проекта WPF передать значение переменной (в данном случае "jj") в плагин для автокада. со всей ответственностью понимаю, что вопрос в общем то базовый но честно рыл просторы(это для любителей ответов типа " А что гугль в вашей деревне не работает") :)).
в WPF определяю переменную:
public string jj=textblk.Text;

в плагине пишу следующее
Код - C# [Выбрать]
  1. MainWindow _test = new MainWindow();
  2. _test.Show();
  3. string jjk = _test.jj;
  4. ed.WriteMessage("\nugol = " + jjk);
  5.  
запускаю. при вызове команды поднимается окно и в тоже време в командной строке, до нажатия на кнопки в окне, сообщение
ugol =
как бороться с безобразием подскажите


« Последнее редактирование: 31-01-2016, 23:27:49 от Александр Ривилис »
Лень - двигатель прогресса.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Попробуй форму запускать из автокадовского класса Application - в нем есть статические методы для показа окон модально/немодально.

Примера нет. На wpf пока не пишу.  :(

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
примерчик можно.
Лень - двигатель прогресса.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Во-первых - для вызова окон лучше использовать Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow (ShowModelessWindow). Модальное окно блокирует основное окно автокада, а немодальное, соответственно не блокирует. Какое нужно вам - решаете сами
Как-то давно Андрей Бушман подсказал как более правильно открывать окна. Вот пример:
Код - C# [Выбрать]
  1. public class MpArmatureFunction
  2.     {
  3.         MpArmature _mpArmatureWin;
  4.         [CommandMethod("ModPlus", "mpArmature", CommandFlags.Modal)]
  5.         public void StartFunction()
  6.         {
  7.             if (_mpArmatureWin == null)
  8.             {
  9.                 _mpArmatureWin = new MpArmature { Separator = MpVars.MpSeparator };
  10.                 _mpArmatureWin.Closed += win_Closed;
  11.             }
  12.  
  13.             if (_mpArmatureWin.IsLoaded)
  14.                 _mpArmatureWin.Activate();
  15.             else
  16.                 AcApp.ShowModelessWindow(AcApp.MainWindow.Handle, _mpArmatureWin, false);
  17.         }
  18.         // Окно закрылось
  19.         void win_Closed(object sender, EventArgs e)
  20.         {
  21.             _mpArmatureWin = null;
  22.         }
  23.     }
Во-вторых - не понятно вы объясняете проблему, а значит и сами не совсем понимаете суть дела происходящего ))))
В-третьих - "проект WPF" и "плагин для автокада" - это неразделимые вещи

Объясните на примере, что вы хотите (например, "хочу окно. На нем кнопка. При нажатии происходит то-то"), а мы вам сделаем пример

P.S. При форматировании кода на форуме правильно выбирайте оформление - для C# нужно и выбирать C#

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Application.ShowModalWindow и Application.ShowModelessWindow
P.S.: Посмотри у меня в подписи как форматировать код на форуме и исправь в своём сообщении.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
задачка такова:
указать правильность открытия формы (было продемонстрированно) и как передать значение переменной в плагин. важен сам способ, по шаблону передать список тоже можно, важно знать как. для себя сделал простое окно и эксперементирую вот пока не пришел ни к чему по сему обратился на форум

Лень - двигатель прогресса.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вот набросал вам для примера:
Извините, вам запрещён просмотр содержимого спойлеров.

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

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

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

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

Проект тоже прикладываю.

Это как пример. Вариантов работы с окнами можно придумать больше. Да и всяких особенностей можете повстречать не мало. Но думаю для начала - вам сойдет для понимания и освоения

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
Александр Пекшев aka Modis,  огромное спасибо за помощь буду разбираться.
Лень - двигатель прогресса.

Отмечено как Решение nolte 06-02-2016, 22:13:13

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
задачка такова:
указать правильность открытия формы (было продемонстрированно) и как передать значение переменной в плагин. важен сам способ, по шаблону передать список тоже можно, важно знать как. для себя сделал простое окно и эксперементирую вот пока не пришел ни к чему по сему обратился на форум
Пишем для AutoCAD и Civil 3D на C#.NET. Часть 11. Использование диалогов Windows Forms
Пишем для AutoCAD и Civil 3D на C#.NET. Часть 11.1. Как передать данные в диалог Windows Forms
Пишем для AutoCAD и Civil 3D на C#.NET. Часть 12. Использование WPF диалогов.

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
Boxa.Shu, Александр Пекшев aka Modis,
еще раз огромное спасибо все получилось видео толковое и понятное.
Текстбоксы и текстблоки работают на ура, комбобокс
временно отказывается, не передает ничего, кто-то подскажет как его побороть.



Лень - двигатель прогресса.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
комбобокс
временно отказывается, не передает ничего, кто-то подскажет как его побороть
Прикладывайте пример! Без примера сложно что-то сказать. В WPF элементы, имеющие items, могут содержать различные данные. Например можно в ComboBox забиндить свой класс, тогда и получать из него данные нужно по особенному. В общем - пример, пример, пример....

P.S. А еще не забывайте плюсовать карму и ставить в теме "решение", если оно есть. Нам так приятней  :)

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
второе сообщение не дает отметить как решение >:( .
Лень - двигатель прогресса.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
второе сообщение не дает отметить как решение >:( .
Отмечать как "Решение" можно только одно сообщение в теме (ограничение движка). Плюсовать/минусовать можно любые сообщения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
доброго времени суток вот и пример
xaml
Извините, вам запрещён просмотр содержимого спойлеров.

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

дополнительный (связующий класс)
DtCombo.cs

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

myPlugin.cs

Извините, вам запрещён просмотр содержимого спойлеров.
« Последнее редактирование: 07-02-2016, 19:02:42 от nolte »
Лень - двигатель прогресса.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Ну раз никто не отвечает, то отвечу я) Visual Studio запускать не охота, поэтому буду так отвечать. Возможно где-то опечатаюсь)
1. Ну во-первых - это уже вопросы не данного форума. Это вопросы по чистому WPF - есть много других форумов хороших, где объяснят лучше
2. this.DataContext = data; - на мой взгляд вы полезли в дебри, которые вам (по опыту) вообще не пригодятся. DataContext для всего окна нужно использовать, когда у вас все окно будет "привязано" к определенному классу. И это касается не только данных, но и событий и прочего. Вам это не нужно
3. У вас два ComboBox - первый сделан правильно, второй - НЕТ! Поэтому и не работает. Чтобы использовать binding нужно для ComboBox задать ItemTemplate. Чтобы заполнить потом этот ComboBox, то нужно задать коллекцию для свойства ItemSource. В вашем случае должно быть так:
Код - XML [Выбрать]
  1. <ComboBox x:Name="CmbxFrom" Grid.Row="1" Margin="10">
  2.     <ComboBox.ItemTemplate>
  3.         <DataTemplate>
  4.             <TextBlock Text={Binding NameL}></TextBlock>
  5.         </DataTemplate>
  6.     </ComboBox.ItemTemplate>
  7. </ComboBox>
Ну и заполнение:
Код - C# [Выбрать]
  1. this.CmbxFrom.ItemSource = data;
Кстати, перед Name не обязательно писать x: - если честно, я даже не помню для чего это нужно))
4. UpdateSourceTrigger=PropertyChanged вам также не нужно. Это требуется обычно для двусторонней связи (еще нужно свойство Mode задать). Причем в этом случае в вашем классе DtCombo должна быть реализация PropertyChanged. По этому поводу можно много найти примеров в интернете. Но если вам ComboBox нужен только чтобы отобразить данные, без передачи обратно в класс (повторюсь - на практике для функций автокада этого достаточно), то всякие PropertyChanged и пр. вам не нужны
5. Чтобы потом написать в командную строку что выбрано в ComboBox, достаточно это ed.WriteMessage("\nCurrent layer :" + _dcombo.NameL); заменить на примерно это ed.WriteMessage("\nCurrent layer :" + _dcombo.CmbxFrom.SelectedItem.ToString());
В данном случае _dcombo.CmbxFrom.SelectedItem будет возвращать вам экземпляр класса DtCombo. Т.е. можете еще так сделать:
Код - C# [Выбрать]
  1. var selectedLayer = _dcombo.CmbxFrom.SelectedItem as DtCombo;
  2. d.WriteMessage("\nCurrent layer :" + selectedLayer.NameL);
6. Дальше смотреть не стал) Вы в проект запихиваете варианты из разных примеров, найденных в интернете - много лишнего) Старайтесь лишнего не писать/копировать - только запутаете