СИТУАЦИЯ:Как показать «закрытое» окно рабочего стола в 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;
}
}
Привет, Даниил, благодарю вас за ответ. Я на самом деле пробовал это, и он не работает. Метод run() запускает createWindow() и все, что следует, но в конце окно не перезагружается на рабочем столе. Я пробовал следующие перестановки. 'code' App.Desktop1.getModule (moduleId) .run(); App.Desktop1.getModule (moduleId) .createWindow(); App.Desktop1.getModule (moduleId) .shortcutItemClick(); 'code' , но никто из них не работает. – AussieChuck
Просьба пояснить, что вы подразумеваете под «перезагрузкой»? Разве это не появляется? –
Привет, Даниил. Да. Я использую слово «перезагрузка», чтобы отличать от простого отображения окна. Как упоминалось в сообщении, я могу использовать метод Show (target), используя Рабочий стол в качестве цели, и окно отображается. Однако связанная кнопка не загружается на панель задач, а не воссоздана, а инструменты максимизации/минимизации/закрытия окна не работают. То, что я подразумеваю под «перезагрузкой», - это вернуть Window на передний план с его полной функциональностью, например, когда оно создано впервые. Приветствия. – AussieChuck