2

多数のコントロール (500 以上) を含む複数のフォームを作成する際のパフォーマンスを向上させる方法はありますか?

コントロールは、以下に示すように、行構成ごとにラベル + 6 つのテキスト ボックスに配置されます。

画像

以下のコンテナーを使用してコントロールを構築しました。

  • DevExpress の XtraLayoutControl
  • 各列の周りのパネルと手動で移動
  • 共通テーブル コントロール

テキストボックスはケースバイケースで非表示にする必要があり、フォームは印刷物にかなり近く見える必要があるため、グリッドを使用することはできません。また、各行には独自のデータ型があるため、それぞれに検証とエディターを追加する必要があります。

テーブル コントロールは最もパフォーマンスが高く、各フォームの読み込みに約 2 秒かかります。

これらのそれぞれがソフトウェア内のドキュメントを表し、ユーザーが一度に複数のドキュメントを開くことができるようにするため、パフォーマンスを改善する方法を見つけようとしています.

1 つの提案は、実際のフォームをキャッシュし、データを格納する状態オブジェクトを用意することでした。ただし、ユーザーは一度に複数のドキュメントを表示できます。

もう 1 つの提案は、ドキュメントを部分的にロードし、ロードされるたびに各部分を表示することでした。印刷物とほとんど同じように見えるドキュメントがあることで知られているため、これは理想的ではありません。

他に利用できる戦略はありますか?それとも、このプログラムは VB6 の前身よりも遅くなるだろうと顧客に伝えるために、銃弾を撃つべきでしょうか?

再開発中のフォーム デザインの例は次のとおりです:リンク

4

2 に答える 2

4

複雑なデータ型の処理などはあなた次第です。これは昼食前の 5 分間のサンプルで、winforms がどれほどひどいものか、WPF ルールがどれほどかを示しています。

namespace WpfApplication5
{

public partial class MainWindow : Window
{
    private List<Item> _items;
    public List<Item> Items
    {
        get { return _items ?? (_items = new List<Item>()); }
    }

    public MainWindow()
    {
        InitializeComponent();

        Items.Add(new Item() {Description = "Base metal Thickness"});

        for (var i = 32; i > 0; i--)
        {
            Items.Add(new Item() {Description = "Metal Specification " + i.ToString()});
        }

        Items.Add(new Item() { Description = "Base metal specification" });

        DataContext = this;
    }
}

public class Item: INotifyPropertyChanged
{
    private List<string> _values;
    public List<string> Values
    {
        get { return _values ?? (_values = new List<string>()); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public string Description { get; set; }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null) 
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    public Item()
    {
        Values.Add("Value1");
        Values.Add("Value2");
        Values.Add("Value3");
        Values.Add("Value4");
        Values.Add("Value5");
        Values.Add("Value6");
    }
}
}

XAML:

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <ItemsControl ItemsSource="{Binding Items}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Description}" Width="130"/>
                    <ItemsControl ItemsSource="{Binding Values}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=.}" Margin="2" Width="90"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

texbox などを非表示にするなど、他にもいくつかの要件があるようです。これらの行が異なるデータ型であるかどうかは関係ありません。ViewModelを実行するだけで済みます(この場合は mypublic class Itemで、画面に表示するデータを保持し、ユーザーが対話できるようにします)。と。

たとえばList<string>、クラスの内部Itemをより複雑なものに置き換えたり、などのプロパティを追加したりできますpublic bool IsVisible {get;set;}

WPF を確認することを強くお勧めします (少なくともこの画面では特に)。

コードをコピーして new -> WPF プロジェクトに貼り付けると、結果を自分で確認できます。

于 2013-01-28T16:28:26.770 に答える