2016-05-26 12 views
3

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

vom ComboBox für 4

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); 
    } 
    } 
+0

Haben Sie 'ScrollViewer.CanContentScrol'l auf' false' ausprobiert? –

+0

@MujahidDaudKhan Ja, funktioniert auch nicht. – MKII

+0

Versuchen Sie zu sehen, ob das PreviewMouseWheel gefeuert wird (sollte es) für die ComboBox, wir sprechen später zurück :) – Natxo

Antwort

1

Sieht für mich wie das Problem ist, dass Sie List_*event* Triggerung statt Ihrer ComboBox s Ereignis ist.

Ich denke, das macht Sinn - es sei denn, ich etwas fehlt ... :)

Grund dafür ist, sie sind beide Kontrollen, aber man ist in einer anderen enthalten ist. So, als Beispiel, wenn Ihre ListView war Vollbild, dann jedes Mal etwas klicken,

private void List_PreviewMouseLeftButtonDown (object Sender, MouseEventArgs E) 
    { 
    startPoint_ = E.GetPosition (null); 
    } 

noch ausgelöst wird.

Ebenso jedes Mal Sie den Mauszeiger auf alle bewegt, man triggert:

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); 
    } 
    } 
} 

du durch Schreiten durch den Code überprüfen kann, während das Debuggen oder Haltepunkte auf diese Ereignisse setzen und Prüfen Sie, ob sie ausgelöst werden, wenn Sie versuchen, untergeordnete Steuerelemente zu betreiben.

Zuletzt, wenn sie sind, könnten Sie einfach eine Klausel in Ihren Code setzen, um zu überprüfen, was eigentlich den Fokus hat und sicherstellen, dass es die ListView ist. Das Problem dabei ist, dass der Fokus auch dann beibehalten werden kann, wenn ein untergeordnetes Steuerelement aktiviert wurde. Die andere Möglichkeit, dieselbe Aktion durchzuführen, besteht darin, sicherzustellen, dass kein Kind den Fokus hat. Dies wird mehr Code sein, da Sie jedes enthaltene Element überprüfen und nicht das enthaltene. Sie könnten jedoch wahrscheinlich eine Methode verwenden, um dies zu überprüfen. Zum Beispiel:

private void List_PreviewMouseLeftButtonDown (object Sender, MouseEventArgs E) 
{ 
    var fs = GetFocusScope(myComboBox); 
    IInputElement fe = FocusManager.GerFocusedElement(fs); 

    if (fe == myListView) 
    { 
     startPoint_ = E.GetPosition (null); 
    } 
} 

ODER

private bool focusCheck() 
{ 
    bool childFocused; 
    var fs = GetFocusScope(myComboBox); 
    IInputElement fe = FocusManager.GetFocusedElement(fs); 

    if (fe == myComboBox) { childFocused = true; } 
    if (fe == myButton) { childFocused = true; } 
    // then repeat the above for every control contained by your list view. 
    return childFocused; 
} 
private void List_PreviewMouseLeftButtonDown (object Sender, MouseEventArgs E) 
{ 
    if (focusCheck() == false) // add this to each event you want to toggle activity of. 
    { 
     startPoint_ = E.GetPosition (null); 
    } 
} 

Wie dem auch sei, ich habe dies überhaupt nicht getestet, aber es könnte funktionieren. Vielleicht hilft es dir zumindest dabei, in eine neue Richtung zu denken!

+0

Ja Das scheint die Ursache zu sein Ich weiß immer noch nicht genau, wie es weitergehen soll, aber ich habe jetzt einen Ausgangspunkt – MKII

+0

@MKII Ich bin mir nicht sicher was du von oben abliest antwortest ja es ist sehr klar, dass wenn Wenn Sie einen Mausklick nach unten oder einen Mausklick auf ein beliebiges inneres Steuerelement ausführen, wird das Ereignis der Listenansicht so ausgeführt, dass ich zuerst nach den Ereignissen gefragt habe. Das Problem ist, dass ich keinen Code in der obigen Beschreibung sehen kann, der die Tendenz hat Der Scroll-Viewer hat mich dazu gebracht zu glauben, dass es irgendeinen Stil oder ein Verhalten für Scrollviewer/Scrollbar geben muss, für die das obige Event ausgeführt wird und Sie nichts mit Controls nach dem Drop-Event machen. –

+0

@KyloRen Wel Ich habe nicht erwartet, dass die ListView-Ereignisse weiter abfeuern würden. Ich dachte, die Ereignisse müssten aufblühen, aber anscheinend nicht. Ich habe überprüft, die falschen Ereignisse werden ausgelöst. So, jetzt weiß ich, was falsch ist, und ich muss eine Lösung darauf finden. – MKII