1

再現手順:

アプリが起動したら、アイテムが生成されるようにコンボボックスを開きます。「Click Me!」をクリックします。ボタン。コード ビハインドでは、コンボ ボックスの itemssource が変更されます。コンボボックスをもう一度開いてみてください。バインドされたコレクションにアイテムが 2 つしかないにもかかわらず、コンボボックスが少なくとも 5 秒間フリーズします。これは単なるテストアプリです。私の実際のアプリケーションでは、2 つ以上の項目があり、ラグが耐えられません。仮想化のオンとオフでこれを試しました。違いはありません。

何がそんなに時間がかかるのですか?これを修正するにはどうすればよいですか? 直接的な修正がない場合、回避策はありますか?

XAML:

    <StackPanel>
        <ComboBox x:Name="cbo" DisplayMemberPath="Junk1"></ComboBox>
        <Button Content="Click Me!" Click="btn_Click"></Button>
    </StackPanel>

コード:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    ObservableCollection<Junk> junk1 = new ObservableCollection<Junk>() {
        new Junk() { Junk1 = "jdkf", Junk2 = "fjdfkasjd;klfj" },
        new Junk() { Junk1 = "jfdk;a", Junk2 = "fjkdljf" } };

    ObservableCollection<Junk> junk2 = new ObservableCollection<Junk>() {
        new Junk() { Junk1 = "fjkdfhsdjk", Junk2 = "fdjkah;" },
        new Junk() { Junk1="", Junk2 = "asdfj" } };

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        this.cbo.ItemsSource = junk1;
    }

    private void btn_Click(object sender, RoutedEventArgs e)
    {
        if (this.cbo.ItemsSource == junk1)
            this.cbo.ItemsSource = junk2;
        else
            this.cbo.ItemsSource = junk1;
        this.cbo.UpdateLayout();
    }
}

public class Junk
{
    public string Junk1 { get; set; }
    public string Junk2 { get; set; }
}
4

2 に答える 2

0

コードを正確にコピーしましたが、期待どおりに完全に動作します。そのため、環境に問題がある可能性があります。

this.cbo.UpdateLayout();注 : 依存関係プロパティとして呼び出す必要はなくItemsSource、変更するとコントロールが自動的に更新されます。

于 2010-11-25T09:20:05.097 に答える
0

myermian - 他のイベントは配線されていません。これがアプリケーション全体です。フリーズ動作を取得するために必要な他のコードはありません。

アーロン - ジャンクは単なる標準クラスです。それは何からも派生しません。コレクションを保持し、.Clear() メソッドを呼び出してから、新しいアイテムを追加しようとしました。私はまったく同じ動作をします。

AnthonyWJones - バグは WPF にあります。Silverlight では試していません。混乱させて申し訳ありません。

于 2010-11-25T02:05:33.207 に答える