【问题标题】:convert XAML to c#将 XAML 转换为 C#
【发布时间】:2011-08-04 06:23:42
【问题描述】:

我需要将followinf 代码转换为c# 代码。 有一个工具可以自动完成吗? 谢谢

 <ListView Name="listView" Margin="0,0,0,164">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="Devise" DisplayMemberBinding="{Binding Path=devise}" Width="80" />
                    <GridViewColumn Header="Libelle" DisplayMemberBinding="{Binding Path=label}" Width="120" />
                    <GridViewColumn Header="Unite" DisplayMemberBinding="{Binding Path=unite}" Width="80" />
                    <GridViewColumn Header="Achat" DisplayMemberBinding="{Binding Path=achatBanque}" Width="80" />
                    <GridViewColumn Header="Vente" DisplayMemberBinding="{Binding Path=venteBanque}" Width="80" />    
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

【问题讨论】:

  • @vcsjones:不,XAML 没有定义类的含义。它只是定义了结构,并且有创建相同对象树的等效 C# 代码。其实XamlReader/BamlReader在做什么。

标签: c# wpf xaml


【解决方案1】:

我认为这样做不应该那么难(使用 CodeDOM),所以我开始研究解决方案。来源可用at github。这真的只是一个开始,它不支持 XAML 的许多功能,但它适用于问题中的代码。

如果您对此很认真,您可以进一步处理该代码。

问题中的 XAML 产生以下输出,这似乎有效:

private ListView Get()
{
    ListView listView = new ListView();
    listView.Name = "listView";
    listView.Margin = ((Thickness)(TypeDescriptor.GetConverter(typeof(Thickness)).ConvertFromInvariantString("0,0,0,164")));
    GridView gridView = new GridView();
    GridViewColumn gridViewColumn = new GridViewColumn();
    gridViewColumn.Header = "Devise";
    Binding binding = new Binding();
    binding.Path = ((PropertyPath)(TypeDescriptor.GetConverter(typeof(PropertyPath)).ConvertFromInvariantString("devise")));
    gridViewColumn.DisplayMemberBinding = binding;
    gridViewColumn.Width = 80D;
    gridView.Columns.Add(gridViewColumn);
    GridViewColumn gridViewColumn2 = new GridViewColumn();
    gridViewColumn2.Header = "Libelle";
    Binding binding2 = new Binding();
    binding2.Path = ((PropertyPath)(TypeDescriptor.GetConverter(typeof(PropertyPath)).ConvertFromInvariantString("label")));
    gridViewColumn2.DisplayMemberBinding = binding2;
    gridViewColumn2.Width = 120D;
    gridView.Columns.Add(gridViewColumn2);
    GridViewColumn gridViewColumn3 = new GridViewColumn();
    gridViewColumn3.Header = "Unite";
    Binding binding3 = new Binding();
    binding3.Path = ((PropertyPath)(TypeDescriptor.GetConverter(typeof(PropertyPath)).ConvertFromInvariantString("unite")));
    gridViewColumn3.DisplayMemberBinding = binding3;
    gridViewColumn3.Width = 80D;
    gridView.Columns.Add(gridViewColumn3);
    GridViewColumn gridViewColumn4 = new GridViewColumn();
    gridViewColumn4.Header = "Achat";
    Binding binding4 = new Binding();
    binding4.Path = ((PropertyPath)(TypeDescriptor.GetConverter(typeof(PropertyPath)).ConvertFromInvariantString("achatBanque")));
    gridViewColumn4.DisplayMemberBinding = binding4;
    gridViewColumn4.Width = 80D;
    gridView.Columns.Add(gridViewColumn4);
    GridViewColumn gridViewColumn5 = new GridViewColumn();
    gridViewColumn5.Header = "Vente";
    Binding binding5 = new Binding();
    binding5.Path = ((PropertyPath)(TypeDescriptor.GetConverter(typeof(PropertyPath)).ConvertFromInvariantString("venteBanque")));
    gridViewColumn5.DisplayMemberBinding = binding5;
    gridViewColumn5.Width = 80D;
    gridView.Columns.Add(gridViewColumn5);
    listView.View = gridView;
    return listView;
}

【讨论】:

  • ...很好的开始,如何添加第 3 方引用?
  • 如果您的意思是如何处理来自 3rd 方程序集的类型,那么在我今天使用正常的 xmlns:something="clr-namespace:Something" 语法对代码进行更新后,这应该可以工作。请参阅演示应用中的示例。
【解决方案2】:

不,没有工具可以自动执行此操作,但通常您可以获取属性并将它们更改为设置属性。虽然您可能会失去某些类型的自动转换,但在这些情况下,您只需要确定属性的类型并使用它(例如下面的 Margin)。

例如:

var gridView = new GridView();

gridView.Columns.Add(new GridViewColumn() {
    Header = "Devise",
    DisplayMemberBinding = new Binding() { Path = "devise" },
    Width = 80
});
// ...

var listView = new ListView() {
    Name = "listView",
    Margin = new Thickness(0, 0, 0, 164),
    View = gridView
};

【讨论】:

  • 这对于香草样本来说非常棒,但转换器的好处是对于众多第三方控件而言,上面的直接方法无济于事!有没有办法在运行时查看“DOM”?
  • @Kumar - 这可能是可能的,但您无法反编译 StaticResourceExtension。我敢肯定还会遇到其他问题(例如隐式样式和模板以及资源)。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多