gpt4 book ai didi

c# - WPF 创建一个控件列表,可以通过鼠标滚动但仍保持功能

转载 作者:行者123 更新时间:2023-11-30 12:18:17 25 4
gpt4 key购买 nike

我有一个通过 WrapPanel 水平显示的控件列表。

我已经实现了“点击和拖动”滚动技术,这样用户就可以通过点击和拖动来使用鼠标滚动。

像这样:

<Canvas x:Name="ParentCanvas" PreviewMouseDown="Canvas_MouseDown" MouseMove="Canvas_MouseMove">
<WrapPanel>
<WrapPanel.RenderTransform>
<TranslateTransform />
</WrapPanel.RenderTransform>

<!-- controls are all in here ... -->
</WrapPanel>
</Canvas>

然后在后面的代码中:

    private Point _mousePosition;
private Point _lastMousePosition;

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
_lastMousePosition = e.GetPosition(ParentCanvas);
e.Handled = true;
}

private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
_mousePosition = e.GetPosition(ParentCanvas);
var delta = _mousePosition - _lastMousePosition;

if(e.LeftButton == MouseButtonState.Pressed && delta.X != 0)
{
var transform = ((TranslateTransform)_wrapPanel.RenderTransform).Clone();
transform.X += delta.X;
_wrapPanel.RenderTransform = transform;
_lastMousePosition = _mousePosition;
}
}

一切正常

但我想做的是当用户点击拖动时,WrapPanel 中的项目响应(即用户只是浏览),但是当用户点击(就像完整的点击一样)然后他们就会响应点击。

就像iphone的工作原理一样,当你直接在应用程序上按下并拖动时,它不会打开应用程序,而是滚动屏幕,但是当你点击应用程序时,它会启动...

我希望这是有道理的。

干杯,标记

最佳答案

我相信您需要捕获鼠标。问题是您将与同样 try catch 鼠标的控件(例如 Button)竞争。

在您的 MouseDown 事件(实际上可能是 PreviewMouseDown)中,您可以使用 e.MouseDevice.Capture(_wrapPanel, CaptureMode.Element)。这应该将所有鼠标输入定向到 _wrapPanel 而不是任何子树元素。

在您的 MouseUp 事件中,您需要通过调用 e.Mousedevice.Capture(null) 来释放捕获。如果没有发生滚动,您将希望向通常会收到我不太确定的点击的控件发送“点击”。也许您可以使用 Automation Peer 类来执行此操作?

诀窍在于,如果您拒绝某些控件的鼠标事件,它们将无法正常工作。以 slider 为例。 slider 如何在像这样工作的面板内使用?

关于c# - WPF 创建一个控件列表,可以通过鼠标滚动但仍保持功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2422464/

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