我想在滚动时按住键盘上的 SHIFT 来ScrollViewer水平滚动。
我从这里了解到,该PointerWheelChanged活动就是我正在寻找的活动。然而,处理它是行不通的,因为它是ScrollViewer在内部处理的,所以我的处理程序永远不会被调用。为了解决这个问题,我使用了“路由事件概述”AddHandler一文中所述的方法。
这有效......但似乎在运行ScrollViewer其内部代码后运行我的代码。其结果是ScrollViewer内容先垂直平移,然后水平平移。它们似乎按照这个顺序发生,并且设置e.Handled = true并不能阻止它。
有没有办法“拦截”滚动,以便我可以用自己的逻辑处理它,从而允许在ScrollViewer按下 SHIFT 时水平平移?我最近在这里问了一个类似的问题(涉及拦截控件的输入,以便我可以用自己的逻辑处理它),其中答案涉及处理不同的事件,该事件发生在控件运行其自己的逻辑之前。我没有看到指针滚动的类似“发生前的事情”事件。
我的代码如下。请注意,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>
Run Code Online (Sandbox Code Playgroud)
隐藏代码:
// Constructor for the user contol.
public MyControl()
{
// Add the scroll wheel event handler and force it to run. …Run Code Online (Sandbox Code Playgroud) 我正在尝试实施一个长期运行的后台进程,定期报告其进度,以更新 UWP 应用程序中的 UI。我怎样才能做到这一点?我看过几个有用的主题,但没有一个包含所有部分,而且我无法将它们全部放在一起。
例如,考虑一个用户选择了一个非常大的文件,并且应用程序正在读取和/或操作文件中的数据。用户单击一个按钮,该按钮将使用用户选择的文件中的数据填充存储在页面上的列表。
第1部分
页面和按钮的点击事件处理程序如下所示:
public sealed partial class MyPage : Page
{
public List<DataRecord> DataRecords { get; set; }
private DateTime LastUpdate;
public MyPage()
{
this.InitializeComponent();
this.DataRecords = new List<DataRecord>();
this.LastUpdate = DateTime.Now;
// Subscribe to the event handler for updates.
MyStorageWrapper.MyEvent += this.UpdateUI;
}
private async void LoadButton_Click(object sender, RoutedEventArgs e)
{
StorageFile pickedFile = // … obtained from FileOpenPicker.
if (pickedFile != null)
{
this.DataRecords = await MyStorageWrapper.GetDataAsync(pickedFile);
}
}
private void UpdateUI(long lineCount)
{ …Run Code Online (Sandbox Code Playgroud)