Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF-如何最好地实现具有可拖动/可缩放子级的面板?_Wpf_Custom Controls_Zooming_Drag - Fatal编程技术网

WPF-如何最好地实现具有可拖动/可缩放子级的面板?

WPF-如何最好地实现具有可拖动/可缩放子级的面板?,wpf,custom-controls,zooming,drag,Wpf,Custom Controls,Zooming,Drag,我试图修改graph#库的默认graph viewer,因为它的用户界面很糟糕(只需尝试将节点拖到边界之外,您就会看到!) 基本设置如下:有一个GraphCanvas控件(从面板继承),它具有顶点和边控件类型的子控件。我想要实现的是: 如果内容不适合屏幕,GraphCanvas有滚动条 GraphCanvas也可以通过“拖动”来滚动(只需单击一个空白区域并拖动) GraphCanvas可以放大和缩小(通过CTRL+鼠标滚轮) 可以拖动顶点。如果将顶点拖动到GraphCanvas的当前边界之外,

我试图修改graph#库的默认graph viewer,因为它的用户界面很糟糕(只需尝试将节点拖到边界之外,您就会看到!)

基本设置如下:有一个GraphCanvas控件(从面板继承),它具有顶点和边控件类型的子控件。我想要实现的是:

  • 如果内容不适合屏幕,GraphCanvas有滚动条
  • GraphCanvas也可以通过“拖动”来滚动(只需单击一个空白区域并拖动)
  • GraphCanvas可以放大和缩小(通过CTRL+鼠标滚轮)
  • 可以拖动顶点。如果将顶点拖动到GraphCanvas的当前边界之外,则边界将增加。滚动条应反映这一点,但是在拖动顶点时,当前视口不应滚动。如果拖动顶点会减少图形的边界,则情况也是如此-在拖动操作完成之前,顶点的大小应保持不变,然后再调整大小。在拖动操作过程中自动滚动视口是非常令人困惑的,并且很容易导致拖动错误。如果您想知道我的意思,请参阅原始实现
虽然我对.NET有相当多的经验,但我仍然是WPF的完全初学者。我当前的尝试是(在测量/排列布局阶段)为每个顶点文本提供它所需的XY坐标(即使是负数),并通过处理GraphCanvas上的鼠标事件和修改RenderTransform属性来实现缩放/滚动。拖动只会更改特定顶点上的XY坐标(可能会触发整个对象的重新布局,这也是最好避免的)。滚动条是通过将GraphCanvas放置在ScrollViewer中并在GraphCanvas上实现IScrollInfo来实现的

不幸的是,这里似乎有一个问题:只有在GraphCanvas本身有背景的情况下,我才能在GraphCanvas上获取鼠标事件。那没关系,反正我想要一个白色背景,但在GraphCanvas的负坐标中,它不会绘制背景,因此不会响应鼠标事件

我还想知道,允许我的所有子控件(顶点和边)进入负坐标是否正确。您将如何实现这一点?
添加:要澄清背景问题,请查看以下屏幕截图:
(来源:)

这里您看到的是一个简单的Windows窗体,上面有一个WPF主机控件。其中有一个ScrollViewer,ScrollViewer中有GraphCanvas。GraphCanvas包含4个顶点和6条边

GraphCanvas被拉伸以填充ScrollViewer。但由于某些顶点处于负坐标,因此应用了RenderTransform,它只是将所有顶点向右移动(TranslateTransform)。它还有一个白色背景笔刷


注意左边的灰色区域。这仍然是GraphCanvas的一部分,但背景笔刷不知何故没有延伸到那里。另外,如果我用鼠标左键单击(不是在节点上,而是在灰色区域),我不会得到一个事件。如果我在白色区域左键单击,我将获得所有事件。

调用canvas.mouseDown和mouse up。此外,如果您将画布背景设置为透明,它仍然是可测试的

在canvas.mouseDown和mouse up上调用。另外,如果你将画布背景设置为透明,它仍然是可测试的,你可以在每个元素上附加一个“可拖动”行为。

你可以在每个元素上附加一个“可拖动”行为。

如果你仔细阅读我的问题,你就会明白为什么这并不总是有效(提示:结尾第二段).您试图在画布边界之外执行什么鼠标手势?也许您可以提供一个屏幕截图?我确实仔细地阅读了你的段落——它仍然不清晰。布拉格,WPF的问题越来越多!现在,它会剪辑主区域之外的边(但奇怪的是不是顶点)。如果向下滚动,则边会在中间切割。考虑到你问题的复杂性,如果没有完整的源代码,我想我帮不了你:(如果你仔细阅读我的问题,你就会明白为什么这不总是有效的(提示:结尾第二段)。你想在画布之外做什么样的鼠标动作?也许你可以提供一个屏幕截图?我确实仔细阅读了你的段落-它仍然不清晰。布拉格,WPF的东西有越来越多的问题!现在它剪辑边(但够奇怪的是不是顶点)在主区域之外。如果我向下滚动,边缘会被切到中间。我找不到如何覆盖这一点。考虑到你问题的复杂性,如果没有完整的复制源代码,我想我无法提供帮助:(