Более

Открытие ArcMap в развернутом состоянии на C #?

Открытие ArcMap в развернутом состоянии на C #?


Я использую Windows 7 Enterprise с ArcMap 10.2

У меня есть приложение, которое обрабатывает данные. Когда обработка данных завершена, у меня есть кнопка, которая покажет результаты в сетке данных. В этой форме таблицы данных у меня есть кнопка, которая откроет ArcMap. Это работает нормально, но только когда ArcMap развернут. Если я открою ArcMap с помощью кнопки и его нормального размера, слой будет отображаться в таблице содержания, но не в элементе управления картой.

То же самое применимо, когда я использую образец автоматизации рабочего стола из SDK.

Как я могу решить эту проблему?

Этот код взят из DesktopAutomation.cs из комплекта разработчика.

// Copyright 2013 ESRI // // Все права защищены законом об авторском праве США // и применимыми международными законами, соглашениями и конвенциями. // // Вы можете свободно распространять и использовать этот образец кода с модификациями // или без них, при условии, что вы включили исходное // уведомление об авторских правах и ограничения на использование. // // Смотрите ограничения использования на /DeveloperKit10.2/userestrictions.txt. // используя System; using System.Collections.Generic; using System.ComponentModel; using System.Data; с помощью System.Diagnostics; с помощью System.Drawing; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; с использованием ESRI.ArcGIS.Framework; с использованием ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.DataSourcesFile; используя ESRI.ArcGIS.Carto; используя ESRI.ArcGIS.ArcMapUI; используя ESRI.ArcGIS.esriSystem; пространство имен DesktopAutomationCS {общедоступный частичный класс Form1: Форма {частное IApplication m_application; // Событие удаления приложения частное IAppROTEvents_Event m_appROTEvent; частный int m_appHWnd = 0; // Получить hWnd активного всплывающего / модального диалога окна владельца [System.Runtime.InteropServices.DllImport ("user32")] private static extern int GetLastActivePopup (int hwndOwnder); общедоступная форма Form1 () {ESRI.ArcGIS.RuntimeManager.Bind (ESRI.ArcGIS.ProductCode.Desktop); InitializeComponent (); // Предварительный выбор опции cboApps.SelectedIndex = 0; } private void btnStartApp_Click (отправитель объекта, EventArgs e) {IDocument doc = null; попробуйте {this.Cursor = Cursors.WaitCursor; switch (cboApps.SelectedItem.ToString ()) {case "ArcMap": doc = new ESRI.ArcGIS.ArcMapUI.MxDocumentClass (); сломать; case "ArcScene": doc = new ESRI.ArcGIS.ArcScene.SxDocumentClass (); сломать; case "ArcGlobe": doc = new ESRI.ArcGIS.ArcGlobe.GMxDocumentClass (); сломать; }} catch {} // Ошибка, если вы окончательно не установили целевое приложение {this.Cursor = Cursors.Default; } if (doc! = null) {// Дополнительно (событие AppROT): обрабатывать выключение вручную, закомментировать, если не требуется m_appROTEvent = new AppROTClass (); m_appROTEvent.AppRemoved + = новый IAppROTEvents_AppRemovedEventHandler (m_appROTEvent_AppRemoved); // Получить ссылку на приложение и сделать ее видимой m_application = doc.Parent; m_application.Visible = true; m_appHWnd = m_application.hWnd; // Включение / отключение элементов управления соответственно txtShapeFilePath.Enabled = true; btnShutdown.Enabled = true; btnDrive.Enabled = ShouldEnableAddLayer; cboApps.Enabled = btnStartApp.Enabled = false; } еще {m_appROTEvent = null; m_application = ноль; txtShapeFilePath.Enabled = false; btnShutdown.Enabled = btnDrive.Enabled = false; cboApps.Enabled = btnStartApp.Enabled = true; }} private void btnShutdown_Click (object sender, EventArgs e) {if (m_application! = null) {// Попробуйте закрыть любые модальные диалоги, отправив клавишу Escape // Он не обрабатывает следующее: // - VBA работает и имеет модальный диалог // - Модальное диалоговое окно не закрывается клавишей Escape Microsoft.VisualBasic.Interaction.AppActivate (m_application.Caption); int nestModalHwnd = 0; в то время как ((nestModalHwnd = GetLastActivePopup (m_application.hWnd))! = m_application.hWnd) {SendKeys.SendWait ("{ESC}"); } // Управление флагом загрязнения документа - отмена изменений IDocumentDirty2 docDirtyFlag = (IDocumentDirty2) m_application.Document; docDirtyFlag.SetClean (); // Остановить прослушивание перед выходом из m_appROTEvent.AppRemoved - = new IAppROTEvents_AppRemovedEventHandler (m_appROTEvent_AppRemoved); m_appROTEvent = ноль; // Выход из m_application.Shutdown (); m_application = ноль; // Сброс пользовательского интерфейса для следующей автоматизации txtShapeFilePath.Enabled = false; btnShutdown.Enabled = btnDrive.Enabled = false; cboApps.Enabled = btnStartApp.Enabled = true; }} private void btnDrive_Click (отправитель объекта, EventArgs e) {this.Cursor = Cursors.WaitCursor; попробуйте {IObjectFactory objFactory = m_application как IObjectFactory; // Использование отражения для получения ClsID типа ShapefileWorkspaceFactory shpWkspFactType = typeof (ShapefileWorkspaceFactoryClass); строка typeClsID = shpWkspFactType.GUID.ToString ("B"); строка shapeFile = System.IO.Path.GetFileNameWithoutExtension (txtShapeFilePath.Text); строка fileFolder = System.IO.Path.GetDirectoryName (txtShapeFilePath.Text); IWorkspaceFactory workspaceFactory = (IWorkspaceFactory) objFactory.Create (typeClsID); IFeatureWorkspace featureWorkspace = (IFeatureWorkspace) workspaceFactory.OpenFromFile (fileFolder, 0); // (@ "C:  data  test", 0); // Создаем слой IFeatureLayer featureLayer = (IFeatureLayer) objFactory.Create ("esriCarto.FeatureLayer"); featureLayer.FeatureClass = featureWorkspace.OpenFeatureClass (shapeFile); // ("мировая сетка"); featureLayer.Name = featureLayer.FeatureClass.AliasName; // Добавляем слой в документ IBasicDocument document = (IBasicDocument) m_application.Document; document.AddLayer (featureLayer); document.UpdateContents (); } catch {} // Или сначала убедитесь, что это действительный файл shp this.Cursor = Cursors.Default; } private void txtShapeFilePath_TextChanged (отправитель объекта, EventArgs e) {btnDrive.Enabled = ShouldEnableAddLayer; } private bool ShouldEnableAddLayer {get {// Разрешить файл .shp только если (System.IO.File.Exists (txtShapeFilePath.Text)) {return (System.IO.Path.GetExtension (txtShapeFilePath.Text) .ToLower () == ".shp"); } else {вернуть ложь; }}} #region "Обработать случай, когда приложение закрывается пользователем вручную" void m_appROTEvent_AppRemoved (AppRef pApp) {// Приложение закрывается вручную. Прекратить прослушивание if (pApp.hWnd == m_appHWnd) // сравнить по hwnd {m_appROTEvent.AppRemoved - = new IAppROTEvents_AppRemovedEventHandler (m_appROTEvent_AppRemoved); m_appROTEvent = ноль; m_application = ноль; m_appHWnd = 0; // Сброс пользовательского интерфейса должен быть в форме потока пользовательского интерфейса этого приложения, // а не потока AppROT; if (this.InvokeRequired) // т.е. не в правильном потоке {this.BeginInvoke (новый IAppROTEvents_AppRemovedEventHandler (AppRemovedResetUI), pApp); } else {AppRemovedResetUI (pApp); // вызов напрямую}}} void AppRemovedResetUI (AppRef pApp) {txtShapeFilePath.Enabled = false; btnShutdown.Enabled = btnDrive.Enabled = false; cboApps.Enabled = btnStartApp.Enabled = true; } private void Form1_FormClosed (object sender, FormClosedEventArgs e) {// Очистить if (m_appROTEvent! = null) {m_appROTEvent.AppRemoved - = new IAppROTEvents_AppRemovedEventHandler (m_appROTEvent_AppRemoved); m_appROTEvent = ноль; }} #endregion}}

Код для открытия Arcmap в максимальном режиме приведен ниже, но он не решает мою проблему. Код по-прежнему действует так же, т.е. загружается в оглавление, но не отображает данные.

if (doc! = null) {// Дополнительно (событие AppROT): обрабатывать выключение вручную, закомментировать, если не требуется m_appROTEvent = new AppROTClass (); m_appROTEvent.AppRemoved + = новый IAppROTEvents_AppRemovedEventHandler (m_appROTEvent_AppRemoved); // Получить ссылку на приложение и сделать ее видимой m_application = doc.Parent; MaximizeApplicationWindow (m_application); m_application.Visible = true; m_appHWnd = m_application.hWnd; // Включение / отключение элементов управления соответственно txtShapeFilePath.Enabled = true; btnShutdown.Enabled = true; btnDrive.Enabled = ShouldEnableAddLayer; cboApps.Enabled = btnStartApp.Enabled = false; public void MaximizeApplicationWindow (приложение ESRI.ArcGIS.Framework.IApplication) {ESRI.ArcGIS.Framework.IWindowPosition windowPos = приложение как ESRI.ArcGIS.Framework.IWindowPosition; windowPos.State = ESRI.ArcGIS.Framework.esriWindowState.esriWSMaximize; }

Как предложил @KirkKuykendall:

Вместо использованияновый MxDocumentClassчтобы запустить arcmap.exe, вы можете попробовать более привычный способ ... используяProcessStartInfoсProcessWindowStyle.Minimized, потомProcess.Start. Тогда послушайAppROTEvents.AppAddedполучитьIApplicationСправка.


Смотреть видео: ArcGis How to remove Nodata from Landsat using Raster Calculator