小编Hem*_*mel的帖子

如何避免 WPF 在我自己的控件上进行安排/测量?

我已经用 C# 开发了一个 3D 引擎,我希望它可以在 WPF 应用程序中通过可以像任何其他 WPF 控件一样使用的类使用。

第一次实施

我创建了一个扩展 Grid 类的面板(我们称之为 EnginePanel),并创建了一组控件,如 SceneNodeControl、GeometryControl 等......这些控件继承了 FrameworkElement WPF 类。

对于 SceneNodeControl,我公开了一个 Children 属性 (UIElementCollection) 并覆盖了该逻辑/视觉管理方法,以便它们查看此集合的内部。

我还覆盖了ArrangeOverride 和MeasureOverride 方法,以便我们在SceneNodeControl 的每个子节点上调用Arrange/Measure,然后返回零像素的常量大小。

此实现有效并允许我使用 ItemsControl、ContentControl 和 DataTemplates 来使用经典的 MVVM 模式填充我的场景图。

问题

我的问题是,如果我创建一个包含数百个 SceneNodeControl 的大型场景图,应用程序会显着变慢。

对 Visual Studio Profiler 的快速检查告诉我,SceneNodeControl 的 Measure 方法负责 80% 到 90% 的 CPU 使用率(就花费的时间而言)。

好的,没问题。我必须做的是删除这些对我来说太重而且无用的计算。

解决方案1

我试图简单地删除对 SceneNodeControl 子项上的排列/测量方法的调用。

这不起作用。正如MSDN 中所指定的,这些方法的实现必须调用子代上的排列/测量。

解决方案2

继承 FrameworkContentElement。事实上,这个类没有布局算法。

但是它没有任何可视化树管理,这使得它无法与 ItemsControls、ContentControl 和 DataTemplates 一起使用。

其他解决方案

我没有其他解决方案......所以这就是我现在在这里的原因!

问题是如何避免 WPF 在我自己的控件上进行安排/测量?

谢谢!

编辑

解决方案3

我为我的问题找到了另一种解决方案(但它产生了越来越多的问题)。 …

wpf

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

为什么用于MSBuild的SonarQube扫描仪不能与MSBuild 15.0一起使用?

我将Visual Studio从2015年升级到2017年.构建过程现在使用MSBuild 15.0,因此我可以使用C#7.

我安装了最新版本6.3的SonarQube服务器,并使用最新版本的C#scanner 2.2.0.24.

我正在尝试从我的解决方案所在的文件夹中分析我的代码:

  1. 跑SonarQube.Scanner.MSBuild.exe begin /key:"myproject".

    SonarQube Scanner for MSBuild 2.2
    Default properties file was found at C:\myfolder\SonarQube.Analysis.xml
    Loading analysis properties from C:\myfolder\SonarQube.Analysis.xml
    Pre-processing started.
    Preparing working directories...
    SonarQube Scanner for MSBuild 2.2
    11:21:18.714  Updating build integration targets...
    11:21:18.735  Fetching analysis configuration settings...
    11:21:19.341  Generating rulesets...
    11:21:19.39  Provisioning analyzer assemblies for cs...
    11:21:19.392  Installing required Roslyn analyzers...
    11:21:19.435  Pre-processing succeeded.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行MSBuild15.1.548.43366版.

    ...
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 跑SonarQube.Scanner.MSBuild.exe end.

    SonarQube …
    Run Code Online (Sandbox Code Playgroud)

c# msbuild sonarqube sonarqube-scan

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

构造函数如何使用复杂算法初始化最终字段?

我正在写一个不可变类Vector3.

class Vector3
{
  final num x, y, z;
  Vector3(this.x, this.y, this.z);
  num get length => ...some heavy code
}
Run Code Online (Sandbox Code Playgroud)

现在,我想编写一个构造函数来计算另一个向量的单位向量.我想根据Dart的建议做到这一点(避免在创建新对象时编写静态方法).

我的问题是我不能编写这个构造函数,因为最终的字段必须在构造函数的主体之前初始化,并且不能在里面初始化.我可以这样写:

Vector3.unit(Vector3 vector)
  : x = vector.x / vector.length,
    y = vector.y / vector.length,
    z = vector.z / vector.length;
Run Code Online (Sandbox Code Playgroud)

但是这太可悲了,我必须计算矢量长度的三倍......

我该怎么做?我应该最终写一个静态方法来计算单位向量吗?(这将是一种耻辱)

而且,最后,是否有可能在构造函数的主体中写入与最终字段的初始化相关的任何内容?为什么?

谢谢!

constructor dart

2
推荐指数
1
解决办法
199
查看次数

标签 统计

c# ×1

constructor ×1

dart ×1

msbuild ×1

sonarqube ×1

sonarqube-scan ×1

wpf ×1