所以我在最新版本的Windows 10上使用VS2017 v15.6.4开始使用UWP并在C#中开发一个简单的应用程序.
运行应用程序时,我注意到它的内存使用量会持续增加.
经过大量的代码配对后,我得出的结论是,这是由页面导航调用引起的,例如:
Frame.Navigate(typeof SomePage);
Frame.GoBack();
Frame.GoForward();
Run Code Online (Sandbox Code Playgroud)
创建和观察这个过程非常容易......
1)在VS2017中,创建一个新的空白应用程序(通用Windows)项目,将其命名为PageTest.
2)向项目添加一个新的空白页,命名为"NewPage".
3)将以下代码添加到MainPage.xaml.cs:
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace PageTest
{
public sealed partial class MainPage : Page
{
DispatcherTimer timer = new DispatcherTimer();
public MainPage()
{
InitializeComponent();
timer.Interval = TimeSpan.FromSeconds(.01);
timer.Tick += Timer_Tick;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
timer.Start();
}
private void Timer_Tick(object sender, object e)
{
timer.Stop();
Frame.Navigate(typeof(NewPage));
}
}
}
Run Code Online (Sandbox Code Playgroud)
4)将以下(几乎相同的)代码添加到NewPage.xaml.cs:
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace PageTest
{ …Run Code Online (Sandbox Code Playgroud) 我在编写 WPF UI 多年后转向 UWP。
使用 WPF 控件,可以通过重写控件的 HitTestCore 方法来提供自定义命中测试逻辑,如下所示:
protected override HitTestResult HitTestCore(PointHitTestParameters params)
{
//Do some kind of test on params.HitPoint
if (HitPointIsOverTheControl(params.HitPoint))
return new PointHitTestResult(this, params.HitPoint);
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
我一直在成功地使用这种方法,通过测试当前鼠标点正下方的图像像素以查看它是否具有 alpha 通道字节,可以测试鼠标是否位于任何不规则形状的 PNG 图像(在图像控件中)上值为 0,如果是,则在上述函数中返回 null。
换句话说,这种方法允许我通过 PNG Alpha 通道蒙版选择可见控件堆栈中位于其下方的任何内容。而且效果出奇的好。
现在到 UWP...
我在 UWP 框架中找不到与上述类似的方法,因此我怀疑“命中测试覆盖”在 UWP 中不可用。
谁能告诉我这种方法在 UWP 中是否仍然可行,如果不行,是否有其他方法可以用来实现相同的结果?
谢谢
编辑:示例
假设有 2 个图像控件彼此重叠,最上面的控件是一个中间有孔的黄色圆圈的图像,底部的图像是一个实心蓝色正方形,它完全被顶部控件覆盖,但可以部分覆盖。透过圆圈中的洞看到。
现在我希望能够a)通过单击它的黄色部分来移动圆圈,或者b)通过通过圆圈中的孔单击它来从下面移动蓝色方块。
好的。当我将鼠标移到黄色圆圈上时,它会触发 PointerMoved 事件,然后我可以确定鼠标是否位于 PNG 图像蒙版的一部分上。到目前为止,一切都很好。
现在假设鼠标位于圆中间的孔上方,我真的想开始接收来自正方形而不是圆的所有指针和操作事件。我能想到的唯一方法是,每当鼠标位于图像的“洞”部分上方时,在圆圈上设置属性“IsHitTestVisible = false”,并在鼠标悬停时在圆圈上设置“IsHitTestVisible = true”图像的“黄色”部分。
这种方法的问题是,一旦我在圆圈上设置“IsHitTestVisible=false”,它将不再引发进一步的 PointerMoved 事件。
换句话说,现在开始更改 PointerMoved 事件中的 IsHitTestVisible 属性为时已晚,因此能够在 WPF 中重写 …