PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: Combobox Dropdown Scroll Event?


Mr. Lolman
2014-09-04, 14:54:11
Gibts irgendein Event für eine C# (WPF) Combobox in dem das Scrollen im Dropdown abfangen kann (inkl gerade markiertem Index/Value)

PatkIllA
2014-09-04, 19:56:19
Ich habe gerade mal testweise folgendes ausprobiert:
<ComboBox ItemsSource="{Binding Path=Items}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<l:MyVirtualizingStackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ComboBox>
Und dann:
class MyVirtualizingStackPanel : VirtualizingStackPanel
{
protected override void OnViewportOffsetChanged(Vector oldViewportOffset, Vector newViewportOffset)
{
base.OnViewportOffsetChanged(oldViewportOffset, newViewportOffset);
}
}

Alternativ im OnApplyTemplate den Scrollviewer aus dem Popup fischen. Der hat ein ScrollChanged Event.


class MyComboBox : ComboBox
{
public override void OnApplyTemplate()
{
base.OnApplyTemplate();

var popup = (Popup)this.GetTemplateChild("PART_Popup");
var decorator = (Decorator)popup.Child;
var border = (Border)decorator.Child;
var scrollViewer = (ScrollViewer)border.Child;
scrollViewer.ScrollChanged += scrollViewer_ScrollChanged;
}

void scrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{

}
}

Oder gleich das ganze Controltemplate überschreiben, aber da muss man immer soviel kopieren und evtl. Ärger mit Themes.

Die Frage bleibt warum ;)

PatkIllA
2014-09-04, 20:25:14
geht noch einfacher
Das ScrollChanged Event ist ein Bubble RoutedEvent
<ComboBox ScrollViewer.ScrollChanged="scrollViewer_ScrollChanged" />

Mr. Lolman
2014-09-05, 08:40:57
Cool. Danke. Kann man auch irgendwie herausfinden, welches Item gerade im Dropdown markiert ist?

Hintergrund: Ich hab zu jedem Eintrag ein Bild in (einem eigenen Control) und will das Bild schon aktualisieren, bevor der SelectedIndex geändert wurde - so quasi als Vorschau.

PatkIllA
2014-09-05, 08:54:47
Man könnte sicher das Template vom Combobox Item ändern und da den Teil für den passenden VisualState anpassen.

Einfach grundsätzlich das Bild binden und dann mit NotifyPropertyChanged das Bild aktualisieren unabhängig von Scrollposition und Selektion ist keine Alternative?
Man kann ja ein DataTemplate für die Einträge in der Combobox angeben.

Mr. Lolman
2014-09-05, 11:06:00
Hm, najo so wichtig ists auch wieder nicht. Direkt binden geht wohl nicht so gut, weil das Comboboxvalue nur indirekt mit dem Bildnamen zu tun hat.

Außerdem ist meine Idee wohl eh nicht so gut, weil man im Dropdown ja sehr schnell herumscrollen kann und jeder indexchange ein neues animiertes gif in ein Image.Control laden würd.