Могу ли я использовать XamlReader.Load или InitializeFromXaml из окна WPF для определения окна? - PullRequest
3 голосов
/ 10 августа 2009

Я хочу создать библиотечный код, который будет включен в приложения WPF. В библиотеке может появиться окно, в зависимости от обстоятельств. Я могу определить окно в XAML, но я хотел бы рассматривать XAML как шаблон. Во время выполнения, во время создания окна, чтобы его можно было отобразить, я хочу заменить определенные теги в шаблоне Xaml значениями, определенными во время выполнения.

Что я хочу сделать, это примерно так:

public partial class DynamicXamlWindow : Window
{
    Button btnUpdate = null;
    public DynamicXamlWindow()
    {
        string s = XamlTemplate;

        // replace some things in the XamlTemplate here

        Window root = System.Windows.Markup.XamlReader.Load(...);
        Object _root = this.InitializeFromXaml(new StringReader(s).ReadToEnd()); //??

        btnUpdate = // ???

        //InitializeComponent();
    }

Строка XamlTemplate выглядит следующим образом:

    private string XamlTemplate = @"
    <Window x:Class='@@CLASS'
            xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
            xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
            Title='@@TITLE' 
            Height='346' Width='380'>

        <Grid>
          ...

Я видел примеры, когда кнопка или раздел определяются в XAML и загружаются динамически. Но это не кнопка или раздел. XamlTemplate предоставляет XAML для фактического окна.

Возможно ли это с InitializeFromXaml или XamlReader.Load ? Если да, то как?

Могу ли я затем получить элементы управления, определенные в XAML, например, btnUpdate во фрагменте кода выше. Как?

Ответы [ 2 ]

4 голосов
/ 11 августа 2009

Нельзя создать динамическую страницу с атрибутом x: class. Однако если код для каждой динамической страницы одинаков, вы можете обмануть его, изменив свой шаблон на:

private string XamlTemplate = @"
    <control:BaseWindow
            xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
            xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
            xmlns:control='WhateverHere'
            Title='@@TITLE' 
            Height='346' Width='380'>
        <Grid>...

Когда вы будете готовы проанализировать это использование:

XamlReader.Parse(xaml);

Если вы хотите получить доступ к элементам в коде позади, вы должны это.FindName ("btnUpdate") в коде позади.

2 голосов
/ 10 августа 2009

Да. Когда вы создали Window в xaml, автоматически созданное частичное определение включает метод InitializeComponent. Содержание этого метода по существу:

System.Uri resourceLocater = new System.Uri("/SampleWpfApp;component/window1.xaml", System.UriKind.Relative);
System.Windows.Application.LoadComponent(this, resourceLocater);

Итак, что вы хотите, это позвонить System.Windows.Application.LoadComponent(windowInstance, uri);

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