gpt4 book ai didi

c# - SHIFT + 滚动可在 ScrollViewer UWP 中水平滚动

转载 作者:行者123 更新时间:2023-12-02 12:49:54 26 4
gpt4 key购买 nike

我希望在滚动时按住键盘上的 SHIFT 可以水平滚动 ScrollViewer

我是从here学到的PointerWheelChanged 事件就是我正在寻找的事件。然而,处理这个问题是行不通的,因为 ScrollViewer 在内部处理它,所以我的处理程序永远不会被调用。为了解决这个问题,我使用了 AddHandler 方法,如 "Routed Events Overview" 中所述。文章。

这有效...但似乎是在 ScrollViewer 运行其内部代码之后运行我的代码。其结果是 ScrollViewer 内容先垂直平移,然后水平平移。它们似乎按该顺序发生,并且设置 e.Handled = true 并不能阻止它。

有没有办法“拦截”滚动,以便我可以用自己的逻辑处理它,从而允许 ScrollViewer 在按下 SHIFT 时水平平移?我最近问了一个类似的问题(涉及拦截控件的输入,以便我可以用自己的逻辑处理它)here ,其中答案涉及处理不同的事件,该事件发生在控件运行其自己的逻辑之前。我没有看到指针滚动的类似“事前发生”事件。

我的代码如下。请注意,ScrollViewer 可以水平和垂直滚动以及缩放:

<!-- Contained in Grid in a UserControl, if that's relevant -->
<ScrollViewer Name="MyCanvasScrollViewer"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
ZoomMode="Enabled"
ZoomSnapPointsType="Optional"
PointerWheelChanged="MyCanvasScrollViewer_PointerWheelChanged">
<!-- Content to pan -->
</ScrollViewer>

隐藏代码:

// Constructor for the user contol.
public MyControl()
{
// Add the scroll wheel event handler and force it to run.
this.MyCanvasScrollViewer.AddHandler(ScrollViewer.PointerWheelChangedEvent, new PointerEventHandler(this.MyCanvasScrollViewer_PointerWheelChanged), true);

// Other un-related stuff omitted here...
}

// Event handler for the Pointer Wheel Changed event.
private void MyCanvasScrollViewer_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
{
// If SHIFT is pressed...
var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
if ((keyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down)
{
// Get the amount to scroll.
PointerPoint pointer = e.GetCurrentPoint(this.WallCanvasScrollViewer);
double scrollWheelDelta = pointer.Properties.MouseWheelDelta;

// Change the view in the scroll viewer.
this.MyCanvasScrollViewer.ChangeView(scrollWheelDelta, null, null, true);

// Mark event as handled.
e.Handled = true;
}
}

最佳答案

您只需在 shift keydown 中禁用 VerticalScrollMode 并在 keyup 上启用它即可。不需要 pointerwheelchanged 本身。它工作得很好。

Xaml

<ScrollViewer ZoomMode="Enabled" x:Name="MyScrollViewer"  HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Visible" >
<Image Height="600" Width="500" Source="/Assets/1.jpg"></Image>
</ScrollViewer>

//C#代码

public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
CoreWindow.GetForCurrentThread().KeyDown += MainPage_KeyDown;
CoreWindow.GetForCurrentThread().KeyUp += MainPage_KeyUp; ;
}

private void MainPage_KeyUp(CoreWindow sender, KeyEventArgs args)
{
if (args.VirtualKey == VirtualKey.Shift)
{
MyScrollViewer.IsScrollInertiaEnabled = true;
MyScrollViewer.VerticalScrollMode = ScrollMode.Enabled;
}
}

private void MainPage_KeyDown(CoreWindow sender, KeyEventArgs args)
{
if (args.VirtualKey == VirtualKey.Shift)
{
MyScrollViewer.IsScrollInertiaEnabled = false;
MyScrollViewer.VerticalScrollMode = ScrollMode.Disabled;
}
}

}

关于c# - SHIFT + 滚动可在 ScrollViewer UWP 中水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53772739/

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