Создать объект окна WPF во время выполнения - PullRequest
1 голос
/ 12 июля 2010

У меня есть функция с одним строковым параметром. Параметр - это имя существующего wpf-окна. Теперь я хочу создать экземпляр окна с помощью строкового параметра и вызвать функцию Show () этого окна.

Ответы [ 2 ]

3 голосов
/ 13 июля 2010

Это зависит от того, какое имя вы даете, это имя файла, в котором определено окно, или имя класса.Обычно это одно и то же, но они могут отличаться.

Например, вы можете поместить в файл "Elephant.xaml" следующее:

<Window x:Class="Animals.Pachyderm" ...>
  ...
</Window>

Если вы это сделаете, тоимя файла окна "Elephant.xaml", но имя класса "Pachyderm" в пространстве имен "Animals".

Загрузка окна с указанным именем файла

Чтобы создать экземпляр и показать окно с именем файла:

var window = (Window)Application.LoadComponent(new Uri("Elephant.xaml", UriKind.Relative));
window.Show();

Таким образом, ваш метод будет выглядеть примерно так:

void ShowNamedWindow(string windowFileName)
{
  var window = (Window)Application.LoadComponent(new Uri(windowFileName + ".xaml", UriKind.Relative));
  window.Show();
}

И будет вызываться так:

ShowNamedWindow("Elephant");

Загрузка окна с именем класса

Для создания и отображения окна с именем класса:

var window = (Window)Activator.CreateInstance(Type.GetType("Animals.Pachyderm"));

Таким образом, ваш метод будет выглядеть примерно так:

void ShowNamedWindow(string className)
{
  var window = (Window)Activator.CreateInstance(Type.GetType("Animals." + className));
  window.Show();
}

И вызываться так:

ShowNamedWindow("Pachyderm");

В качестве альтернативы вы можете включить пространство имен (в данном примере «Животные») в параметр ShowNamedWindow вместо добавления его внутри метода.

Загрузка окна с указанием только заголовка

Это не рекомендуется, поскольку это может быть очень дорогостоящей операцией.Вам потребуется получить сборку, выполнить итерацию всех типов в сборке, которые являются подклассом Window, создать экземпляр каждого из них и извлечь его свойство Title.Это фактически создаст (но не покажет) одно окно каждого типа в вашем приложении, пока оно не найдет правильное.Поэтому я бы использовал имя файла или имя класса, если это вообще возможно.

0 голосов
/ 12 июля 2010
Window newWindow = new Window() { Title = "a_string" };
newWindow.Show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...