WPF Programmatically Scrollen eine Leinwand in einem Item
-
27-09-2019 - |
Frage
ich eine ItemsControl
haben, die eine Leinwand in einem ScrollViewer
enthält. Die Leinwand ist groß und nur ein Teil davon zeigt zu einem Zeitpunkt. Ich will es programmatisch scrollen (der Benutzer klickt und zieht die Leinwand zu blättern). Ich sah durch die Scroll Methoden und versuchte, die folgend in den Maus-Event-Handler:
var scrollViewer = (sender) as ScrollViewer;
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX);
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY);
Allerdings bedeutet dies nichts. Ich überprüfte die Werte von deltaX und deltaY und sie sind gültige Werte (wie 3, 5 etc.). Die HorizontalOffset
und VerticalOffset
bleiben 0 jederzeit, auch nach den obigen Zeilen ausgeführt wird.
Hier ist meine XAML:
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
MouseUp="ScrollViewer_MouseUp" MouseMove="ScrollViewer_MouseMove"
PreviewMouseLeftButtonDown="ScrollViewer_PreviewMouseLeftButtonDown" Background="Transparent">
<ItemsControl ItemsSource="{Binding BubbleVMCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- My template here -->
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding AbsoluteLeft}" />
<Setter Property="Canvas.Top" Value="{Binding AbsoluteTop}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</ScrollViewer>
Jede Hilfe / Vorschläge sehr geschätzt wird!
Lösung
Es funktioniert gut (Scrollrollen) in meiner Test-Anwendung:
<ScrollViewer Name="scrollViewer"
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
MouseUp="ScrollViewer_MouseUp" MouseMove="ScrollViewer_MouseMove"
PreviewMouseLeftButtonDown="ScrollViewer_PreviewMouseLeftButtonDown" Background="Transparent">
<ItemsControl ItemsSource="{Binding BubbleVMCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Width="5000" Height="5000"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- My template here -->
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding AbsoluteLeft}" />
<Setter Property="Canvas.Top" Value="{Binding AbsoluteTop}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</ScrollViewer>
und der Code hinter:
Point capturePoint { get; set; }
private void ScrollViewer_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
scrollViewer.CaptureMouse();
capturePoint = e.MouseDevice.GetPosition(scrollViewer);
}
private void ScrollViewer_MouseUp(object sender, MouseButtonEventArgs e) {
scrollViewer.ReleaseMouseCapture();
}
private void ScrollViewer_MouseMove(object sender, MouseEventArgs e) {
if (!scrollViewer.IsMouseCaptured) return;
Point currentPoint = e.MouseDevice.GetPosition(scrollViewer);
var deltaX = capturePoint.X - currentPoint.X;
var deltaY = capturePoint.Y - currentPoint.Y;
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX);
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY);
}
Könnten Sie einige weitere Details des Problems erstellen Sie erleben?
Andere Tipps
Eine andere mögliche Lösung ... für einen TreeView verwendet, aber nicht sehen, warum der Code nicht funktionieren sollte in Ihrem Fall: