2013-06-28 3 views
1

СИТУАЦИЯ:Как показать «закрытое» окно рабочего стола в Ext.Net?

Я разрабатываю веб-приложение Ext.Net с использованием компонента Desktop, и у меня возникли проблемы с открытием окна после его создания в первый раз.

Цикл начинается с представления «Index», которое просто создает основную среду рабочего стола. С этой точки зрения, модуль создан, который имеет функцию обработчика JS следующим образом:

.Modules(
    X.DesktopModule() 
     .ModuleID("ModuleTitle") 
     .Shortcut(
     X.DesktopShortcut() 
      .Name("Module Title") 
      .IconCls("custom-icon") 
       .Handler("loadModuleWindow(Desktop,'AssetManager');") 
) 

Функция обработчика «loadModuleWindow», то есть ответственность, чтобы решить, если окно должно быть создано в первый раз или имеет были созданы уже и просто нужно показать снова:

function loadModuleWindow(callingContainer, moduleId) { 

    //Dynamically build name of script by convention  
    loadScriptFile("Scripts/" + moduleId + "Scripts.js", "js"); 

    //Only create new window if it hasn't been created already 
    if (App[moduleId] == undefined) { 
     App.direct.CreateModuleWindow(callingContainer.id, moduleId); 
    } else { 
     App[moduleId].show(); 
    } 
} 

Когда Desktop создается и модуль под названием впервые, отделенного кода метода «CreateModuleWindow» называется и окно возвращается клиенту ,

Окно настройки с:

window.CloseAction = CloseAction.Hide; 

Все работает отлично до этого момента, вопрос идет о том, когда окно закрывается (щелкнув по нему близко кнопку [X]). Как и ожидалось, окно скрыто от текущего представления, а также «индикатор» на панели задач также удаляется.

Как вы могли догадаться, намерение использовать обработчик («loadModuleWindow») состоит в том, чтобы избежать вызова сервера, если окно уже загрузилось.

Однако, когда метод Show() вызывается в этом окне, происходят две вещи:

1) Если я вызываю метод Show() без аргументов, ничего не происходит. Окно остается скрытым, и оно снова не отображается на рабочем столе.

2) Если я вызываю метод, например Show (callerContainer.id), чтобы указать ему цель, окно отображается на рабочем столе, но окно «индикатор» на панели задач не перезагружается, и я получаю сообщение об ошибке что свойство offsetWidth не определено.

ВОПРОС:

Кто-нибудь знает любой другой метод, который можно назвать, когда окно было настроено с CloseAction = Скрыть, чтобы «восстановить» его на рабочем столе, как при создании в первый раз?

** UPDATE: ПОЛНЫЙ КОД Репродуцировать ВОПРОС ** * ** *

ENTRY POINT CONTROLLER (DektopController.CS)

[DirectController] 
public class DesktopController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [DirectMethod(ShowMask = true)] 
    public ActionResult CreateModuleWindow(string callingContainerId, string moduleId) 
    { 
     //Only AJAX requests are allowed 
     if (Request.IsAjaxRequest() == true) 
     { 
      ControllerHelpers.CreateAndAttachWindow(this, callingContainerId, moduleId); 
      return this.Direct(); 
     } 
     else //No direct URL access 
     { return new EmptyResult(); } 
    } 
} 

CONTROLLER ПОМОЩНИКИ

public static Window GetWindowViewModel(string moduleId) 
    { 
     // Dynamically instantiate the ViewModel class 
     // By convention, the ViewModel that creates the Window is named 
     // moduleName + "ViewModel". 
     // The ViewModel should also assign the moduleId to the window.ID 

     Type type = Type.GetType("App.Web.ViewModels." + moduleId + "ViewModel"); 

     Object obj = Activator.CreateInstance(type); 

     return (Window)obj; 
    } 

    public static void CreateAndAttachWindow(Controller cont, string callingContainerId, string moduleId) 
    { 
     Desktop callingContainer = cont.GetCmp<Desktop>(callingContainerId); 

     Window moduleWindow = GetWindowViewModel(moduleId); 

     if (moduleWindow != null) 
     { 
      callingContainer.CreateWindow(moduleWindow); 
     } 
    } 

RAZOR индексный файл

@model Ext.Net.Desktop 

@{ 
    ViewBag.Title = "Desktop"; 
    Layout = "~/Views/Shared/_Desktop.cshtml"; 
    var X = Html.X(); 
} 

@(
X.Desktop() 
    .ID("MyDesktop") 
     .Listeners(l => 
     { 
      l.Ready.BroadcastOnBus = "App.Desktop1.Ready"; 
     }) 
     .Modules(
      X.DesktopModule() 
       .ModuleID("Module1") 
       .Shortcut(
        X.DesktopShortcut() 
         .Name("Module 1") 
         .Handler("loadModuleWindow(App.MyDesktop,'Module1');") 
       ) 
     ) 
     ) 

"loadModuleWindow" JAVASCRIPT FILE

function loadModuleWindow(callingContainer, moduleId) { 

    //Only create new window if it hasn't been created already 
    if (App[moduleId] == undefined) { 
     App.direct.CreateModuleWindow(callingContainer.id, moduleId); 

     //Set the returned window to the module, by convention, the 
     //window.id is the same as the moduleId. 
     App[callingContainer.id].getModule(moduleId).setWindow(moduleId); 
    } else { 
     App[callingContainer.id].getModule(moduleId).run(); 
    } 
} 

Module1 Модельное FILE

public class Module1ViewModel : Window 
{ 
    public Toolbar TopToolBar {get; private set;} 
    public TreePanel AssetHierarchy { get; private set; } 

    public Module1ViewModel() 
    { 
     this.ID = "Module1"; 
     this.Title = "Module1"; 
     this.Width = 1400; 
     this.Height = 600; 
     this.Layout = LayoutType.Border.ToString(); 
     this.CloseAction = CloseAction.Hide; 
     this.Stateful = true; 
    } 
} 

ответ

0

Существует несколько вопросов.

Во-первых, идентификаторы модуля и его окна должны быть уникальными, они являются отдельными компонентами.

Итак, пожалуйста, измените, например, в Module1ViewModel.

this.ID = "Module1_Window" 

Во-вторых, CreateWindow десктопе показывает окно, независимо от каких-либо модулей и setWindow вызов не достаточно, чтобы прикрепить окно к модулю. У нас должны быть удобные методы для присоединения Window к модулю, но в настоящее время у нас их нет. На данный момент я могу предложить следующее решение.

Заменить функцию loadModuleWindow с:

function loadModuleWindow(callingContainer, moduleId) { 
    var module = App[callingContainer.id].getModule(moduleId); 

    if (!module.win) { 
     App.direct.CreateModuleWindow(moduleId, { 
      success: function (result) { 
       module.autoRun = true; 
       module.addWindow(function() { return eval(result)[0] }); 
      } 
     }); 
    } else { 
     module.run(); 
    } 
} 

Заменить метод CreateModuleWindow с:

[DirectMethod(ShowMask = true)] 
public ActionResult CreateModuleWindow(string moduleId) 
{ 
    Window moduleWindow = GetWindowViewModel(moduleId); 
    moduleWindow.AutoRender = false; 
    string moduleWindowCfg = ComponentLoader.ToConfig(moduleWindow); 

    return this.Direct(moduleWindowCfg); 
} 

Оставьте остальные вещи без каких-либо изменений.

Некоторые примечания относительно дизайна.

Как правило, модуль Desktop не поддерживает прикрепление к нему окна «на лету», поскольку модуль предполагается использовать как неделимое устройство с его окном. Это означает, что модуль ожидает, что окно будет предварительно определено для модуля. Как это должно быть сделано. Вы можете создать окно без какого-либо присвоения его любому модулю, или вы можете создать целый модуль «на лету».

+0

Привет, Даниил, благодарю вас за ответ. Я на самом деле пробовал это, и он не работает. Метод run() запускает createWindow() и все, что следует, но в конце окно не перезагружается на рабочем столе. Я пробовал следующие перестановки. 'code' App.Desktop1.getModule (moduleId) .run(); App.Desktop1.getModule (moduleId) .createWindow(); App.Desktop1.getModule (moduleId) .shortcutItemClick(); 'code' , но никто из них не работает. – AussieChuck

+0

Просьба пояснить, что вы подразумеваете под «перезагрузкой»? Разве это не появляется? –

+0

Привет, Даниил. Да. Я использую слово «перезагрузка», чтобы отличать от простого отображения окна. Как упоминалось в сообщении, я могу использовать метод Show (target), используя Рабочий стол в качестве цели, и окно отображается. Однако связанная кнопка не загружается на панель задач, а не воссоздана, а инструменты максимизации/минимизации/закрытия окна не работают. То, что я подразумеваю под «перезагрузкой», - это вернуть Window на передний план с его полной функциональностью, например, когда оно создано впервые. Приветствия. – AussieChuck