为什么由具有动态绘制形状的单个窗口组成的WPF应用程序会占用300 mb的内存?

如何解决为什么由具有动态绘制形状的单个窗口组成的WPF应用程序会占用300 mb的内存?

我正在开发一个用于整理桌面的应用程序。我希望能够选择一个窗口(给定一些特殊的键组合,例如win + shift +鼠标单击等),然后将窗口拖动到自定义的正方形,然后应用程序会将窗口移到该正方形的边界。

所有这些都很好-但我还需要在屏幕上绘制自定义区域。我现在一直在使用p / invoke并将调试报告吐出到控制台-应用程序本身+控制台调试需要几百千字节的内存,没什么大不了的。我以为我会尝试使用WPF渲染区域,因为它可以很好地处理透明度,并且我认为透明度会很好-除此之外,我可以使用canvas对象在矩形上轻松绘制矩形。

不幸的是,当我放下WPF视觉效果时,它从〜700k变为〜300,000k,这并不理想。对于这样一个简单的WPF应用程序,这种用法正常吗?忽略应用程序代码,仅关注下面的WPF代码,我应该做些限制内存消耗的事情吗?我猜想我在WPFGrid构造函数中做错了什么,但不知道它可能是什么。

using System.Collections.Generic;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using GridRenderer;

namespace WPFGridRenderer
{
    public class MainWindow : Window
    {

    }

    public class WPFGrid : IGridRender
    {
        private Application WinApp;
        private Window MainWindow;
        private Canvas Canvas;
        private Brush ActiveBrush;
        private Brush InactiveBrush;

        public Dictionary<RenderedGrid,Rectangle> Rectangles = new Dictionary<RenderedGrid,Rectangle>();

        public WPFGrid(int width,int height,IEnumerable<RenderedGrid> grids)
        {
            var t = new Thread(() => {
                //Allow application to bootup
                //TODO: Replace with semaphore or other time agnostic thread guarding mechanism
                Thread.Sleep(1000);


                //TODO: Allow for custom configuration via config file? 
                ActiveBrush = new SolidColorBrush(Color.FromArgb(195,255,255));
                InactiveBrush = new SolidColorBrush(Color.FromArgb(125,0));

                WinApp = new Application();
                MainWindow = new MainWindow();
                
                //Generate Window
                MainWindow.WindowStyle = WindowStyle.None;
                MainWindow.AllowsTransparency = true;
                MainWindow.Background = Brushes.Transparent;
                MainWindow.Topmost = true;
                MainWindow.Left = 0;
                MainWindow.Top = 0;
                //Can be pretty big,the size of n monitors (For my testing this is 3600x1200)
                MainWindow.Width = ScreenInfo.GetDisplays().MaxWidth;
                MainWindow.Height = ScreenInfo.GetDisplays().MaxHeight;
                MainWindow.Content = (Canvas = new Canvas());

                updateGrids(grids);
                WinApp.Run(MainWindow); // note: blocking call
            });
            t.SetApartmentState(ApartmentState.STA);
            t.Start();

        }

        public void HideGrid()
        {
            WinApp.Dispatcher.Invoke(() =>
            {
                MainWindow.Background = Brushes.Transparent;
                MainWindow.Hide();
            });
        }

        public void RenderGrid()
        {
            WinApp?.Dispatcher.Invoke(() =>
            {
                MainWindow.Background = InactiveBrush;
                MainWindow.Show();
            });
        }

        public void ActivateSector(RenderedGrid grid)
        {
            WinApp?.Dispatcher.Invoke(() =>
            {
                foreach (var rect in Rectangles)
                {
                    rect.Value.Fill = rect.Key == grid ?
                        ActiveBrush :
                        Brushes.Transparent;
                }
            });
        }

        public void UpdateGrids(IEnumerable<RenderedGrid> grids)
        {
            WinApp.Dispatcher.Invoke(() =>
            {
                updateGrids(grids);
            });
        }

        private void updateGrids(IEnumerable<RenderedGrid> grids)
        {
            Canvas.Children.Clear();
            Rectangles.Clear();
            foreach (var grid in grids)
            {
                var rect = new System.Windows.Shapes.Rectangle();
                rect.StrokeThickness = 2;
                rect.Stroke = Brushes.Black;
                Canvas.SetLeft(rect,grid.TargetLeft);
                Canvas.SetTop(rect,grid.TargetTop);
                rect.Width = grid.TargetRight;
                rect.Height = grid.TargetBottom;
                Canvas.Children.Add(rect);
                Rectangles[grid] = rect;
            }
        }
    }
}```

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-