WPF-如何最好地实现具有可拖动/可缩放子级的面板?
我试图修改graph#库的默认graph viewer,因为它的用户界面很糟糕(只需尝试将节点拖到边界之外,您就会看到!) 基本设置如下:有一个GraphCanvas控件(从面板继承),它具有顶点和边控件类型的子控件。我想要实现的是:WPF-如何最好地实现具有可拖动/可缩放子级的面板?,wpf,custom-controls,zooming,drag,Wpf,Custom Controls,Zooming,Drag,我试图修改graph#库的默认graph viewer,因为它的用户界面很糟糕(只需尝试将节点拖到边界之外,您就会看到!) 基本设置如下:有一个GraphCanvas控件(从面板继承),它具有顶点和边控件类型的子控件。我想要实现的是: 如果内容不适合屏幕,GraphCanvas有滚动条 GraphCanvas也可以通过“拖动”来滚动(只需单击一个空白区域并拖动) GraphCanvas可以放大和缩小(通过CTRL+鼠标滚轮) 可以拖动顶点。如果将顶点拖动到GraphCanvas的当前边界之外,
- 如果内容不适合屏幕,GraphCanvas有滚动条李>
- GraphCanvas也可以通过“拖动”来滚动(只需单击一个空白区域并拖动)李>
- GraphCanvas可以放大和缩小(通过CTRL+鼠标滚轮)李>
- 可以拖动顶点。如果将顶点拖动到GraphCanvas的当前边界之外,则边界将增加。滚动条应反映这一点,但是在拖动顶点时,当前视口不应滚动。如果拖动顶点会减少图形的边界,则情况也是如此-在拖动操作完成之前,顶点的大小应保持不变,然后再调整大小。在拖动操作过程中自动滚动视口是非常令人困惑的,并且很容易导致拖动错误。如果您想知道我的意思,请参阅原始实现
添加:要澄清背景问题,请查看以下屏幕截图:
(来源:) 这里您看到的是一个简单的Windows窗体,上面有一个WPF主机控件。其中有一个ScrollViewer,ScrollViewer中有GraphCanvas。GraphCanvas包含4个顶点和6条边 GraphCanvas被拉伸以填充ScrollViewer。但由于某些顶点处于负坐标,因此应用了RenderTransform,它只是将所有顶点向右移动(TranslateTransform)。它还有一个白色背景笔刷
注意左边的灰色区域。这仍然是GraphCanvas的一部分,但背景笔刷不知何故没有延伸到那里。另外,如果我用鼠标左键单击(不是在节点上,而是在灰色区域),我不会得到一个事件。如果我在白色区域左键单击,我将获得所有事件。调用canvas.mouseDown和mouse up。此外,如果您将画布背景设置为透明,它仍然是可测试的在canvas.mouseDown和mouse up上调用。另外,如果你将画布背景设置为透明,它仍然是可测试的,你可以在每个元素上附加一个“可拖动”行为。你可以在每个元素上附加一个“可拖动”行为。如果你仔细阅读我的问题,你就会明白为什么这并不总是有效(提示:结尾第二段).您试图在画布边界之外执行什么鼠标手势?也许您可以提供一个屏幕截图?我确实仔细地阅读了你的段落——它仍然不清晰。布拉格,WPF的问题越来越多!现在,它会剪辑主区域之外的边(但奇怪的是不是顶点)。如果向下滚动,则边会在中间切割。考虑到你问题的复杂性,如果没有完整的源代码,我想我帮不了你:(如果你仔细阅读我的问题,你就会明白为什么这不总是有效的(提示:结尾第二段)。你想在画布之外做什么样的鼠标动作?也许你可以提供一个屏幕截图?我确实仔细阅读了你的段落-它仍然不清晰。布拉格,WPF的东西有越来越多的问题!现在它剪辑边(但够奇怪的是不是顶点)在主区域之外。如果我向下滚动,边缘会被切到中间。我找不到如何覆盖这一点。考虑到你问题的复杂性,如果没有完整的复制源代码,我想我无法提供帮助:(