Krik
Fleet Admiral
- Registriert
- Juni 2005
- Beiträge
- 15.029
Moin,
ich programmiere gerade an einem kleinen Programm, bei dem man per Touch-Drag'n'Drop ListViewItems von einer ListView in eine andere schieben soll.
Die ListViews sind so definiert:
Die DragList wird mit diesen Daten gefüttert:
Die Drag'n'Drop-Events für die Touch-Eingabe sehen so aus:
Soweit ist alles i. O.
In der Praxis sieht es dann aber aber so aus, dass der Prozess auf einem kleinen DualCore-Tablet 37% Prozessorlast erzeugt und die Anwendung extrem langsam reagiert. Das geht so weit, dass man Sekunden auf eine Reaktion warten muss.
Die Verlangsamung beginnt, sobald man in der DragList das ausgewählte Item ändert, also auf ein anderes "touched."
Es muss etwas mit dem Drag'n'Drop oder dem Code drumherum zu tun haben, da ich ausschließlich hier das Problem habe. Mit Maus-Drag'n'Drop läuft übrigens alles einwandfrei und schnell.
Erkennt jemand vielleicht den Grund für die Verlangsamung oder hat eine Vermutung, woher das Problem kommt?
Gruß, Laurin
Edit:
Es ist noch ein zweites Problem aufgetaucht, das eventuell mit diesem hier zusammenhängt.
Ein Item wird in der DragList nicht richtig ausgewählt (kann man nicht per SelectedItem-Property holen), wenn man einfach nur den Finger drauf hält und rüberzieht. Man muss zwangsweise das Item antippen und den Finger wieder vom Bildschirm nehmen, bevor man dann "anfassen" und rüberziehen kann.
Tippt man das Item nicht an, ist es mit einem hellblauen Rahmen markiert. Tippt man es an, ist es mit einem Rahmen in einem dunkleren Blau markiert. Ich tippe deswegen darauf, dass hier irgendwie die Events nicht richtig geroutet werden (aber warum? ich greife doch nicht sonderlich groß ein).
ich programmiere gerade an einem kleinen Programm, bei dem man per Touch-Drag'n'Drop ListViewItems von einer ListView in eine andere schieben soll.
Die ListViews sind so definiert:
Code:
<ListView x:Name="DragList" SelectionMode="Single" MouseMove="DragList_MouseMove" TouchMove="DragList_TouchMove" />
<ListView x:Name="DropList" SelectionMode="Single" AllowDrop="True" Drop="DropList_Drop" DragEnter="DropList_DragEnter" DragLeave="DropList_DragLeave" />
Code:
DragList.ItemsSource = new ObservableCollection<ListViewItem>()
{
new ListViewItem() { Content = "Element 1", FontSize = 14, Height = 40, BorderThickness = new Thickness(2), BorderBrush = Brushes.Black, HorizontalContentAlignment = HorizontalAlignment.Center, Margin = new Thickness(5) },
new ListViewItem() { Content = "Element 2", FontSize = 20, Height = 55, BorderThickness = new Thickness(2), BorderBrush = Brushes.Black, HorizontalContentAlignment = HorizontalAlignment.Center, Margin = new Thickness(5) },
new ListViewItem() { Content = "Element 3", FontSize = 25, Height = 70, BorderThickness = new Thickness(2), BorderBrush = Brushes.Black, HorizontalContentAlignment = HorizontalAlignment.Center, Margin = new Thickness(5) },
new ListViewItem() { Content = "Element 4", FontSize = 31, Height = 85, BorderThickness = new Thickness(2), BorderBrush = Brushes.Black, HorizontalContentAlignment = HorizontalAlignment.Center, Margin = new Thickness(5) },
new ListViewItem() { Content = "Element 5", FontSize = 36, Height = 100, BorderThickness = new Thickness(2), BorderBrush = Brushes.Black, HorizontalContentAlignment = HorizontalAlignment.Center, Margin = new Thickness(5) }
};
Die Drag'n'Drop-Events für die Touch-Eingabe sehen so aus:
Code:
private void DragList_TouchMove(object sender, TouchEventArgs e)
{
if (sender != null && e.GetTouchPoint(DragList) != null && e.GetTouchPoint(DragList).Action == TouchAction.Move && DragList.SelectedItem != null)
{
DragDrop.DoDragDrop(DragList, DragList.SelectedItem, DragDropEffects.Move);
}
}
private void DropList_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(ListViewItem)))
{
ListViewItem item = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
DropList.Items.Add(item);
DropList.BorderBrush = Brushes.Black;
DragList.SelectedItem = null; // Workaround für Programmcrash
DropList.SelectedItem = null;
e.Handled = true;
}
}
private void DropList_DragEnter(object sender, DragEventArgs e)
{
DropList.BorderBrush = Brushes.Red;
}
private void DropList_DragLeave(object sender, DragEventArgs e)
{
DropList.BorderBrush = Brushes.Black;
}
In der Praxis sieht es dann aber aber so aus, dass der Prozess auf einem kleinen DualCore-Tablet 37% Prozessorlast erzeugt und die Anwendung extrem langsam reagiert. Das geht so weit, dass man Sekunden auf eine Reaktion warten muss.
Die Verlangsamung beginnt, sobald man in der DragList das ausgewählte Item ändert, also auf ein anderes "touched."
Es muss etwas mit dem Drag'n'Drop oder dem Code drumherum zu tun haben, da ich ausschließlich hier das Problem habe. Mit Maus-Drag'n'Drop läuft übrigens alles einwandfrei und schnell.
Erkennt jemand vielleicht den Grund für die Verlangsamung oder hat eine Vermutung, woher das Problem kommt?
Gruß, Laurin
Edit:
Es ist noch ein zweites Problem aufgetaucht, das eventuell mit diesem hier zusammenhängt.
Ein Item wird in der DragList nicht richtig ausgewählt (kann man nicht per SelectedItem-Property holen), wenn man einfach nur den Finger drauf hält und rüberzieht. Man muss zwangsweise das Item antippen und den Finger wieder vom Bildschirm nehmen, bevor man dann "anfassen" und rüberziehen kann.
Tippt man das Item nicht an, ist es mit einem hellblauen Rahmen markiert. Tippt man es an, ist es mit einem Rahmen in einem dunkleren Blau markiert. Ich tippe deswegen darauf, dass hier irgendwie die Events nicht richtig geroutet werden (aber warum? ich greife doch nicht sonderlich groß ein).
Zuletzt bearbeitet: