如何优化wpf应用程序的性能

时间:2010-06-29 11:23:09

标签: wpf optimization

我使一个wpf应用程序运行良好。但每当我的xml的大小很大时,每当我们从xml获取数据时,它的运行速度非常慢,如下面的代码 是任何机构建议我这是因为这或可能是其他问题

我怎么能改革这一点 谢谢 shashank`

              DataSet xmlData = new DataSet();
            XmlTextReader reader = null;
            try
            {
                if (File.Exists(CommonUtils.xmlPath))
                {
                    //convert XmlDocument to XmlTextReader
                    reader = new XmlTextReader(new StringReader(CommonUtils.DecryptXML().OuterXml));
//get the xml data
                    xmlData.ReadXml(reader);
                    reader.Close();

                    //get category rows from 
                    DataRow[] eventRows = xmlData.Tables["M_EVENT"].Select(" ROW_STATUS=1");
                    if (eventRows.Length > 0)
                    {

                        //create a datatable for event 
                        DataTable dtEvent = xmlData.Tables["M_EVENT"].Clone();


                        //add a default row to the event table
                        DataRow dr = dtEvent.NewRow();
                        dr[0] = "-1";
                        dr[1] = "--Select Event--";
                        dr[2] = "1";
                        dtEvent.Rows.InsertAt(dr, 0);
                        foreach (DataRow row in eventRows)
                        {
                            DataRow drEvent = dtEvent.NewRow();
                            drEvent["PK_EVENT_ID"] = row["PK_EVENT_ID"];
                            drEvent["EVENT_NAME"] = row["EVENT_NAME"];
                            drEvent["EVENT_TYPE"] = row["EVENT_TYPE"];
                            dtEvent.Rows.Add(drEvent);
                        }

                        //bind the category drop down
                        cmbEvent.DataContext = dtEvent.DefaultView;
                        cmbEvent.SelectedValuePath = "PK_EVENT_ID";
                        cmbEvent.DisplayMemberPath = "EVENT_NAME";

                        cmbEvent.SelectedIndex = 0;


                    }
                }
                else
                {

                    Lblgetevent.Visibility = Visibility.Visible;

                }

            }`   

1 个答案:

答案 0 :(得分:1)

哎哟!

你在使用DataTable做什么?!对于此目的而言,它非常低效,并且需要您编写大量额外代码。另外,为什么要从代码而不是XAML中设置ComboBox属性?

更简单的方法是将ComboBox直接绑定到XML:

<ComboBox ItemsSource="{Binding EventXml, XPath=M_EVENT[ROW_STATUS=1]}"
          ...>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding XPath=EVENT_NAME}" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

这比DataTable技术更好,但添加“Select Event”行将需要添加CompositeCollection。这可以做到,但是......

最好的解决方案是使用LINQ to XML:

public object Events
{
  get
  {
    return new[] { new { Name = "--Select Event--", Id = -1 }}.Concat(
      from element in EventsXml.Elements("M_EVENT")
      where element.Element("ROW_STATUS").Value=="1"
      select new
      {
        Name = element.Element("EVENT_NAME").Value,
        Id = int.Parse(element.Element("PK_EVENT_ID").Value),
      });
  }
}

使用这个简单的XAML:

<ComboBox ItemsSource="{Binding Events}" SelectedValuePath="Id" ...>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Name}" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

LINQ to XML解决方案比绑定到XML更快,而这反过来比使用DataTable更快。不仅如此,LINQ to XML解决方案比其他两个解决方案更清晰。