Доступ к окнам по имени - PullRequest
0 голосов
/ 01 февраля 2012

Я новичок в WPF из мира Delphi.Я решил проблему ниже (хотя и мучительно) в мире Delphi и надеюсь, что в мире WPF есть более элегантное решение.

Мне нужно прочитать в XML-файле, содержащем меню «дерево», которое имеетимена окон в нем, а также подсказки меню, а затем смогут "показать" окно на основе его имени.

Например, сегмент меню с двумя вариантами может иметь XMLнапример:

<MenuLeaf>
  <Header>Product information</Header>
  <MenuLine>    
    <Prompt>Product Master File</Prompt>
    <WindowName>Products.xaml</WindowName>
  </MenuLine>
  <MenuLine>    
    <Prompt>Inventory Data</Prompt>
    <WindowName>Inventory.xaml</WindowName>
  </MenuLine>
</MenuLeaf>

Поэтому, когда пользователь выбирает «Данные инвентаризации», я буду знать, что я хочу сделать «показ» окна Inventory.xaml ..... но я толькоиметь буквенную строку «Inventory.xaml».

У меня будет сотни таких форм, и время от времени XML-файл может изменяться - поэтому для меня неэффективно иметь стандартный код

Dim window as New Inventory
window.Show

для каждого из нескольких сотен окон.

Мне нужно кое-что, что делает

Dim window as New {go out and find the Inventory file with name Inventory.xaml}
window.Show

Я без конца искал это без удачи.

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Я думаю, что путь к решению - использовать Reflection, который позволит вам динамически находить / вызывать ваши классы.Скажите, что ваше пространство имен MyNs, тогда у вас должен быть класс «Products», соответствующий файлу «Products.xaml».Чтобы найти его, используйте MyFoundType = MyNs.GetType ("Products")
Затем получите конструктор по умолчанию (или другой, если хотите) для этого типа: MyFoundType.GetConstructor ().Затем вызовите конструктор (с необходимыми аргументами) -> теперь у вас есть окно как объект.
Приведите его к окну и вызовите его метод Show, и все готово.

http://msdn.microsoft.com/en-us/library/y0cd10tb.aspx
http://msdn.microsoft.com/en-us/library/h93ya84h.aspx
http://msdn.microsoft.com/en-us/library/6ycw1y17.aspx

0 голосов
/ 01 февраля 2012

Вам необходимо использовать объект XamlReader, который анализирует XAML во время выполнения и создает объект.

var rdr = XmlReader.Create(File.Open("Inventory.xaml"));
var window = XamlReader.Load(rdr) as Window;
window.Show();

XamlReader.Load вернет любой фактический элемент верхнего уровня в XAML; если это Window, вы можете просто .Show. Если это что-то еще, вам понадобится контейнер для его размещения. Например, у вас может быть Window с элементом Border в нем и выполните:

var control = XamlReader.Load(rdr) as UserControl;
var window = new MyHostWindow();
window.ContentBorder.Child = control;

Если вы на самом деле не знаете тип элемента в вашем XAML, вы обычно можете использовать FrameworkElement, который является базовым классом для всех визуальных элементов, хотя вы не получите от него поведения, специфичного для Window.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...