你如何通过WPF中的c#代码编写逐字XAML代码?

时间:2013-10-10 11:17:46

标签: c# wpf xaml runtime

我想在运行时将纯XAML代码添加到我的xaml元素中。有谁知道这是怎么做到的吗?谢谢。 我想做这样的事情:myGrid.innerXAML = stringXAMLcode 这将导致<grid name="myGrid">newgeneratedcodehere</grid>

在PHP中,您可以将逐字HTML代码直接打印到HTML文件中。这可能与c#有关吗? 如果没有,有人可以提出解决方案吗? 谢谢!

3 个答案:

答案 0 :(得分:2)

如本CodeProject文章中所述,有很多方法可以解决您在这里所要求的问题:

Creating WPF Data Templates in Code: The Right Way

然而,大​​部分时间你真的不需要日常操作。

如果你正在使用WPF,你真的需要放弃其他框架的传统方法并拥抱The WPF Mentality

与XAML的WPF实现相比,HTML(4,5或其他)看起来像一个荒谬的笑话,因此在HTML中你可能习惯的所有可怕的黑客都是完全不需要的,因为后者有很多内置功能,可帮助您以非常干净的方式实现高级UI功能。

WPF在很大程度上基于DataBinding,并促进了用户界面和数据之间清晰明确的分离。

例如,通过使用名为DataTemplates的WPF功能,当您想要根据数据“显示不同的UI”时,您会采取以下措施:

XAML:

 <Window x:Class="MyWindow"
            ...
            xmlns:local="clr-namespace:MyNamespace">

       <Window.Resources>

          <DataTemplate DataType="{x:Type local:Person}">

             <!-- this is the UI that will be used for Person -->
             <TextBox Text="{Binding LastName}"/>

          </DataTemplate>

          <DataTemplate DataType="{x:Type local:Product}">

              <!-- this is the UI that will be used for Product -->
              <Grid Background="Red">
                  <TextBox Text="{Binding ProductName}"/>
              </Grid>

          </DataTemplate>

       </Window.Resources>

       <Grid>
           <!-- the UI defined above will be placed here, inside the ContentPresenter -->
           <ContentPresenter Content="{Binding Data}"/>
       </Grid>

    </Window>

代码背后:

public class MyWindow
{
    public MyWindow()
    {
        InitializeComponent();
        DataContext = new MyViewModel();
    }
}

视图模型:

public class MyViewModel
{
   public DataObjectBase Data {get;set;} //INotifyPropertyChanged is required
}

数据模型:

public class DataObjectBase
{
   //.. Whatever members you want to have in the base class for entities.
}

public class Person: DataObjectBase
{
    public string LastName {get;set;}
}

public class Product: DataObjectBase
{
    public string ProductName {get;set;}
}

请注意我是如何谈论我的DataBusiness Objects而不是担心操纵用户界面的任何黑客行为。

还要注意如何定义将由Visual Studio编译的XAML文件中的DataTemplates如何为我的XAML提供编译时检查,而不是在程序中将string放在一起代码,当然没有任何一致性检查。

我强烈建议您阅读Rachel's回答(上面链接)和相关博文。

WPF Rocks

答案 1 :(得分:0)

为什么不准确添加您想要的元素?类似的东西:

StackPanel p = new StackPanel();
Grid g = new Grid();

TextBlock bl = new TextBlock();
bl.Text = "This is a test";

g.addChildren(bl);

p.addChildren(g);

您可以对XAML中存在的所有元素执行此操作。

此致

答案 2 :(得分:0)

您可以使用XamlReader创建可以设置为内容控件或布局容器子代的UIElement

    string myXamlString = "YOUR XAML THAT NEEDED TO BE INSERTED";
    XmlReader myXmlReader = XmlReader.Create(myXamlString);
    UIElement myElement = (UIElement)XamlReader.Load(myXmlReader);
    myGrid.Children.Add(myElement );