小编Nig*_*elP的帖子

导航页面时,所有UWP应用程序是否都会泄漏内存?

所以我在最新版本的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)

.net memory-leaks uwp windows-10-universal

9
推荐指数
1
解决办法
1645
查看次数

UWP 是否可以覆盖命中测试?

我在编写 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 中重写 …

hittest uwp

5
推荐指数
1
解决办法
737
查看次数

标签 统计

uwp ×2

.net ×1

hittest ×1

memory-leaks ×1

windows-10-universal ×1