gpt4 book ai didi

c# - WPF以编程方式在项目控件中滚动 Canvas

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:18 25 4
gpt4 key购买 nike

我有一个 ItemsControl,它在 ScrollViewer 中包含一个 Canvas 。 Canvas 很大,一次只能显示一部分。我想以编程方式滚动它(用户单击并拖动 Canvas 进行滚动)。我查看了 ScrollViewer 方法并在鼠标事件处理程序中尝试了以下操作:

var scrollViewer = (sender) as ScrollViewer;
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX);
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY);

但是,这没有任何作用。我检查了 deltaX 和 deltaY 的值,它们是有效值(如 3、5 等)。 Horizo​​ntalOffsetVerticalOffset 始终保持为 0,即使在执行上述行之后也是如此。

这是我的 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>

感谢任何帮助/建议!

最佳答案

它在我的测试应用程序中运行良好(ScrollViewer 滚动):

<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>

以及背后的代码:

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

您能否发布您遇到的问题的更多详细信息?

关于c# - WPF以编程方式在项目控件中滚动 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3852376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com