0

WPFのメインフォームをロードして、フォームがアパート状態にあるときに別のスレッドがデータベースからデータを取得するようにするにはどうすればよいですか?(ドラッグ可能/移動可能)

私はこれがこのようにあなたのメインフォームから新しいウィンドウを開くことで可能であることを知っています:

Private Sub openOrderWindow()
    Dim OrderWindow As Orders = New Orders
    OrderWindow.ShowDialog()
End Sub

Private Sub ButtonImport_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles ButtonImport.Click
    Dim iThread As System.Threading.Thread = New System.Threading.Thread(AddressOf openOrderWindow)
    iThread.SetApartmentState(System.Threading.ApartmentState.STA)
    iThread.Start()
    ListViewOrderDetail.Focus()
    ' Me.Close()
End Sub

'ShowDialog'を使用しているため

しかし、メインウィンドウではShowDialogを呼び出すことができません

私が試したこと:

 Private Sub AccessDBFilling()
ListViewDataGrid.ItemsSource = Nothing
    accessdblist = Nothing
accessdblist = accessdb.GetFromAccess()
ListViewDataGrid.ItemsSource = accessdblist
End Sub

 Private Sub refresh()
    ListViewDataGrid.Dispatcher.Invoke(New Action(AddressOf AccessDBFilling))
End Sub

Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    iThread = New System.Threading.Thread(AddressOf refresh)
    iThread.SetApartmentState(System.Threading.ApartmentState.STA)
    iThread.Start()
End Sub

私は入れてみましたMyBase.ShowDialog()そして.Show()そして.9000+他のもの

別のスレッドを使用してデータベースからロードすることで得られる唯一の利点は、画面をすぐに見ることができることです(ロードされるまで透明なボックスであるのとは対照的に)が、移動したり最小化したりすることはできません

ロード中に移動可能にする方法はありますか?

4

1 に答える 1

1

はい。あなたは自分がしたことを理解する必要があります。

ListViewDataGrid.Dispatcher.Invoke(New Action(AddressOf AccessDBFilling))

UIコントロールのディスパッチャーは、UIスレッドに対応しています。したがって、UIスレッドに正確にデータをロードするため、UIはフリーズします。

ここであなたがすべきこと:

Private Sub AccessDBFilling()
    ListViewDataGrid.ItemsSource = Nothing
    accessdblist = Nothing
    accessdblist = accessdb.GetFromAccess()
    //I'm not sure, but you can try the following lines of code. uncomment one of them.

    //ListViewDataGrid.Dispatcher.Invoke(() => ListViewDataGrid.ItemsSource = accessdblist);
    //ListViewDataGrid.ItemsSource = accessdblist;
End Sub

Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Action loadFromDb = AccessDBFilling;
    loadFromDb.BeginInvoke();
End Sub

私はVBを知らないので、C#から翻訳する必要があります:)

于 2012-04-27T05:01:55.800 に答える