Ich habe eine ListView
, die eine Reihe von Elementen anzeigt. Abhängig von der Art des Elements wird die korrekte DataTemplate
ausgewählt, um sie anzuzeigen. Eine der Vorlagen ist für Listen von Elementen, die innerhalb einer ComboBox
gerendert werden.Probleme bei der Verwendung einer ComboBox in einem ListView
Datatemplate
<DataTemplate x:Key="comboBoxTemplate0">
<ComboBox
ItemsSource="{Binding options}" ToolTip="{Binding Title}"
Margin="2" MinWidth="50" MinHeight="20" HorizontalAlignment="Stretch"
VerticalAlignment="Center">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</DataTemplate>
Nun fand ich ein Problem, das ich nicht erklären kann, und ich glaube, es irgendwie zu konzentrieren in Beziehung gesetzt werden kann, aber ich weiß es nicht. Wenn ich das Dropdown für die ComboBox öffne, kann ich den internen ScrollViewer nicht ziehen. Ich kann das Rad verwenden, um auf und ab zu gehen, oder die Pfeiltasten, aber das Ziehen funktioniert nicht, stattdessen wird der ScrollViewer in der ListView aktiviert (durch Ziehen des internen ScrollViewers wird also der äußere ScrollViewer verschoben).
Ich kann nicht scheinen, diesen Fehler zu reproduzieren, noch kann jemand finden, der es mit ihnen geschehen hat, so bin ich ratlos. Ich denke darüber nach, aufzugeben und den internen ScrollViewer einfach zu verstecken, damit er nicht gezogen werden kann.
Was könnte die Ursache für dieses Verhalten sein? Warum bewegt sich der ScrollViewer der externen ListView, wenn ich versuche, den ScrollViewer der internen ComboBox zu ziehen?
EDIT
Dinge versucht:
CanContentScroll
auf false einstellen - nicht
Das Listview hört
PreviewDragOver
nicht gefeuert Funktioniert Ereignisse:
P reviewMouseLeftButtonDown
private void List_PreviewMouseLeftButtonDown (object Sender, MouseEventArgs E)
{
startPoint_ = E.GetPosition (null);
}
Mouse
private void List_MouseMove (object Sender, MouseEventArgs E)
{
if (allowDrag_)
{
Vector Difference = startPoint_ - E.GetPosition (null);
if (Mouse.LeftButton == MouseButtonState.Pressed &&
(Math.Abs (Difference.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs (Difference.Y) > SystemParameters.MinimumVerticalDragDistance))
{
PerformDragAndDrop ((DependencyObject)E.OriginalSource, (ListView)Sender);
}
}
}
Dragenter
private void List_DragEnter (object Sender, DragEventArgs E)
{
if (!E.Data.GetDataPresent (Strings.DragnDropFormatString) ||
Sender == E.Source)
{
E.Effects = DragDropEffects.None;
}
}
and Drop
private void List_Drop (object Sender, DragEventArgs E)
{
if (E.Data.GetDataPresent (Strings.DragnDropFormatString))
{
CSettingBase Data = E.Data.GetData (Strings.DragnDropFormatString) as CSettingBase;
if (LoadedSettings.FirstOrDefault (s => s.Name == Data.Name) == null)
{
LoadedSettings.Add (Data);
Utility.AutoSizeGridViewColumns (ListViewControl);
this.HideColumns (8);
if (((ObservableCollection<CSettingBase>)this.ListViewControl.ItemsSource).FirstOrDefault (x => x.IsGroup == true) == null)
{
this.ExpandColumns (1);
}
else
{
this.ExpandColumns (8);
}
}
}
}
PerformDragAndDrop
public void PerformDragAndDrop (DependencyObject Origin, ListView List)
{
ListViewItem GridRow = Utility.FindAncestor<ListViewItem> (Origin);
if (GridRow != null)
{
CSettingBase Data = (CSettingBase)List.ItemContainerGenerator.ItemFromContainer (GridRow);
// Initialize the Drag and Drop operation
DataObject DragData = new DataObject (Strings.DragnDropFormatString, Data);
DragDrop.DoDragDrop (GridRow, DragData, DragDropEffects.Move);
}
}
Haben Sie 'ScrollViewer.CanContentScrol'l auf' false' ausprobiert? –
@MujahidDaudKhan Ja, funktioniert auch nicht. – MKII
Versuchen Sie zu sehen, ob das PreviewMouseWheel gefeuert wird (sollte es) für die ComboBox, wir sprechen später zurück :) – Natxo