Коротко о проблеме. Для отображения собственных диалоговых окон, созданных на WPF, необходимо использовать метод Application.ShowModelessWindow(_mw);
public class CommandClass
{
static MainWindow _mw;
[CommandMethod("OpenMdlWindow")]
public static void OpenWindow()
{
if (_mw == null)
{
_mw = new MainWindow();
Application.ShowModelessWindow(_mw);
}
_mw.Closed += _mw_Closed;
}
}
Допустим мы создали на нашей форме кнопку, при нажатии которой запускается процесс очистки чертежа с помощью стандартной команды _purge. Для этого в обработчик события нажатия на кнопку добавляем метод:
Document _acDoc;
internal void Clear()
{
_acDoc.SendStringToExecute(
"._-PURGE " + "_ALL " + "\n" + "_N ",
false, false, false
);
};
Что произойдет при нажатии на кнопку? А ничего, пока мы не кликнем мышью в окне AutoCAD-а.
Избежать ненужного ручного перевода фокуса, используя только .NET API AutoCAD-а не получиться, поэтому придется использовать P/Invoke. Делается это просто:
1. Добавляем
[DllImport("user32.dll")]
extern static IntPtr SetFocus(IntPtr hWnd);
2. Изменяем наш метод
internal void Clear()
{
SetFocus(Application.DocumentManager.MdiActiveDocument.Window.Handle);
_acDoc.SendStringToExecute(
"._-PURGE " + "_ALL " + "\n" + "_N ",
false, false, false
);
}
Все.
ссылка на оригинал статьи http://habrahabr.ru/post/168971/
Добавить комментарий