小编Avi*_*Avi的帖子

从另一个调用一个构造函数

我有两个构造函数,它们将值提供给只读字段.

public class Sample
{
    public Sample(string theIntAsString)
    {
        int i = int.Parse(theIntAsString);
        _intField = i;
    }

    public Sample(int theInt) => _intField = theInt;
    public int IntProperty    => _intField;

    private readonly int _intField;
}
Run Code Online (Sandbox Code Playgroud)

一个构造函数直接接收值,另一个构造函数进行一些计算并获取值,然后设置字段.

现在这里是抓住:

  1. 我不想复制设置代码.在这种情况下,只设置一个字段,但当然可能不止一个.
  2. 要使字段只读,我需要从构造函数中设置它们,因此我无法将共享代码"提取"到实用程序函数中.
  3. 我不知道如何从另一个构建函数调用.

有任何想法吗?

c# constructor

927
推荐指数
8
解决办法
43万
查看次数

位图性能优化模式

我发现了几种用于优化WPF中位图处理的模式.但是,我不了解何时使用每种模式.我认为这是一个常见问题,我总结了我的理解和猜测,并请求您的帮助.如果您可以添加模式,解释它们的不同之处,解释它们是否使用CPU或GPU,并教授何时使用它们以及如何组合它们,这将是一个巨大的帮助!

上下文 - 图像"网格"场景:

我的应用程序必须显示许多位图图像.图像以行和列网格状组织显示在屏幕上(不一定是Grid或UniformGrid类,想想Window Media Player的Album视图).图像可能在不同的网格单元之间移动 任意单元格中的某些图像可能会被其他图像替换.图像应该是可点击的,应该提供一个上下文菜单,应该是可选择的,可拖动的等等.换句话说,"将小虫子组合成一个大的位图"是不适用的,至少不是天真的.

模式0:黑客

将小虫子组合成位图(如何绘制上下文?),并将其用作背景.使用空内容处理命中,上下文菜单,事件等的图像叠加此图像.

优点是我们这里只讨论两个位图:当前显示的位图和应该替换它的位图.这应该非常快.然而,我多年的经历引发了危险的危险.你的评论?

模式1:减小图像大小

如果您事先知道要调整大小的图像大小,以及当您准备丢失性能的详细信息(颜色)时,这是一个明智的做法:

  1. 使用BitmapImage.DecodePixelWidth减小位图大小
  2. 使用FormatConvertedBitmap.DestinationFormat减少颜色信息
  3. 将控件的缩放行为设置Image.Stretch设置为Stretch.None
  4. 将图像的SetBitmapScalingMode设置为LowQuality.
  5. 冻结虫子

见代码在这里.

模式2:背景预取

当您认为可以利用用户注视屏幕上的图像时,此模式适用,并提前准备要显示的下一个图像.除了内存开销之外,项目的缺点是它必须支持.Net Framework 4目标而不仅仅是客户端配置文件,因此它可能会在客户端上进行安装.你自己将不得不忍受异步编程的痛苦.

在此模式中,您可以精确创建所需数量的图像控件.当需要添加,移动或删除位图时,您只需修改Image控件的BitmapSource(s).BackgroundWorker任务负责预取BitmapSource(可能使用上面的"Reduce Image Size"模式)并将它们插入MemoryCache.

为此,您必须将BitmapImage的CacheOption设置为OnLoad,以便将工作卸载到后台工作程序.

模式3:绘制上下文

这是从在MSDN WPF论坛Microsoft支持建议谢尔登Ziao 这里.有关DrawingContext的说明,请参阅Adam Nathan的WPF 4中的第494页,第15章"2D图形".我不能说我理解它.根据这里的答案,我认为这将改善几何图纸的处理,而不是位图.接下来,我认为这不会支持图像的焦点和事件要求(我不好在论坛上没有更好地解释要求)而且,我很担心这本书的总结句:"注意使用DrawingContext不会改变您在保留模式系统中运行的事实.指定的图纸不会立即发生; 命令由WPF保留,直到需要它们为止."这意味着一旦我们的偶数处理程序恢复,我们就无法利用"背景预取"中的并行性.

模式4:可写位图

这里的MSDN文档将其描述为双缓冲系统:您的UI线程更新缓冲区; WPF的渲染线程将其移动到视频内存.

预期用法(参见此处)适用于在显示等视频电影中发生重大变化的位图.我不确定,但可能会被黑客攻击并与背景预取模式结合并在网格场景中使用.

模式5:缓存的位图

关于MSDN的信息不多(这里).在WPF论坛存档(这里),它解释说"BitmapCache API旨在缓存你的内容(当在硬件中渲染时)在视频内存中,这意味着它仍然驻留在你的GPU上.这样可以节省在将内容绘制到屏幕时重新呈现内容的成本."这似乎是一个好主意.但是,我不确定是什么陷阱以及如何使用它.

模式6:RenderTargetBitmap

RenderTargetBitmap将Visual转换为位图.我不确定这里是否相关.看到这里.

编辑:关于Paul Hoenecke的问题:我写过"我的应用程序必须显示许多位图".我没有提到,我需要显示约800图像并发.

人们可以阅读我的问题所涉及的性能问题WPF Bitmap性能以及如何使WPF上的图像显示更加"活泼"?

我已经修改了模式1的描述,以突出显示未创建或删除图像控件的概念(除非我们想要显示更大或更小的网格).只有它们的Sources被设置为不同的,新的或null的BitmapSources.

编辑: …

wpf optimization performance design-patterns bitmap

36
推荐指数
1
解决办法
1万
查看次数

MVVM,Unity,Prism,MEF,Caliburn - 我应该使用什么?

请帮忙 - 我迷路了!

我正在编写一个小型桌面应用程序,它有一些控件和一些屏幕.这应该稍后与一个小网站集成,也有一些屏幕.我们的想法是让用户编辑视频并选择图像,然后与朋友分享他们的结果.

桌面应用程序使用的是C#WPF,即网站 - ASP.Net MVC.

我读到使用MVVM可以更轻松地将应用程序增加到几个屏幕.所以我开始搜索并发现了Caliburn.Micro和MVVM.Light.我已经下载了一些教程,但正如我准备深入研究材料一样,我在SO上找到.那里还有Prism,MEF,Unity,ReactiveUI - 这太过分了!

我学习新东西很糟糕 - 学习WPF和ASP.Net MVC花了我很多年的时间.我不想研究很多新材料,只是为了稍后发现它不相关.而且我没有一位建筑师来指导我.

所以我的问题是:你能否对这些框架和技术进行透视,并建议我应该把重点放在研究和使用上(特别是后来用于Windows 8的内容)?

prism mef unity-container mvvm-light caliburn.micro

31
推荐指数
3
解决办法
2万
查看次数

C#工厂 - 是必须的?

C#工厂模式是否需要向上转换?

我希望上课在图书馆G中在班级图书馆A中创造一个亚当,而不使G依赖于A.上帝在班级图书馆E中为夏娃制作亚当斯,夏娃可以知道并依赖亚当.(编辑 - 这个样本越来越好:)

我能想到的解决方案是在A中有一个AdamFactory.这样AdamFactory知道Adam并且可以很容易地创建它(可能只是调用Adam的构造函数).上帝收到一个AdamFactory,可以命令CreateAdam.

现在,因为上帝不被允许认识亚当,AdamFacotry的CreateAdam必须返回一个物体,这需要Eve将AdamFactory返回的物体向上投射到亚当身上.

我认为这会奏效.然而,我对上传感到不安,因为这是禁忌.这真的是必须的吗?

PS - 没有Blasphemy的意图,如果某人的感受受到伤害我会道歉.使用上帝和亚当而不是创造者和创造似乎更好,因为后两个词彼此太相似了.

编辑:重新接口建议.让我们假设Adam有两种方法:ProvideLove,ProvideFood和ProvideProtection(我们保持这个样本是kis-safe :).夏娃将亚当用于这两个目的,但当然上帝没有.那么为什么要向上帝提供AdamFactor返回实现IAdam而不仅仅是对象的东西的知识呢?我不明白!

编辑:工作代码(同一个库中的每个人,我的目标是分离到不同的库)看起来像这样:

Adam God.LoadAdam(AdamID theAdamID)
       var adam = new Adam(theAdamId, this)

Adam.Adam(AdamID theAdamID, God theGod)
      _god = theGod
      _mind  = theGod.LoadMind(theAdamId, this)

Mind God.LoadMind (AdamID theAdamID, Adam theAdam)
      var mind  = new Mind (theAdam)
      var mindId = new minId(theAdamId)
      mind.DeserializeFromFile(minId)

Mind.Mind (Adam theAdam)
      _adam = theAdam
Run Code Online (Sandbox Code Playgroud)

c# factory casting factory-pattern

18
推荐指数
1
解决办法
932
查看次数

Caliburn.Micro可以很好地使用用户控件吗?

我是新手WPF程序员.我正在尝试为我的代码添加一些结构:用户控件和MVVM.

在这里研究,我发现人们推荐Caliburn.Micro.另一方面,我在这里其他地方发现了一些关于Caliburn.Micro在UserControls上玩得不好的投诉.

所以我的问题是:Caliburn.Micro能否很好地使用用户控件?

wpf user-controls mvvm caliburn.micro

17
推荐指数
1
解决办法
1万
查看次数

构建过程 - 使用什么?

我正在考虑使用PowerShell和/或C#编写自己的交付代码,可能是对NAnt或MSBuild进行炮轰.

  1. 我为什么这样走?与使用NAnt或MSBuild相比,这是一项非常艰苦的努力吗?
  2. 任何好的,现代的书都能提供帮助吗?
  3. 有更好的想法吗?

背景(PS这对某些人来说是宗教问题.没有侮辱意图):

一人开店,多个探索性项目.作为我们大多数人 - 现在的Windows和ASP.Net.考虑移动和云.

我已经开始干涉NAnt了,并试图使用NAnt和CruiseControl.Net跟踪Expert .Net Delivery.整个"交付"问题已经解决,现在是时候"解冻"了.但是,我不知道该走哪条路.从我所学到的:

NAnt正在显示它的年龄.它很笨拙:理解和维护比C#等现代的OO语言更难理解和维护.即使在我读完这本书之后,在一个神秘的环境中工作似乎很奇怪,你想要执行的是XML,循环和继承(据我记得在"冰河时代"之前)很难做到.

MSBuid是MS特定的.我甚至不确定它是否会支持非MS环境.团队基础服务器很贵.

即便如此,他们似乎都提供了价值,因为在我的SO搜索中我没有听到任何人使用他们自己的自定义软件.但是,我不明白为什么不使用C#并根据需要简单地调用NAnt和/或MSBuild任务.

SO - NAnt Vs. 的MSBuild

我的建议正好相反 - 避免像瘟疫这样的MSBuild.NANT更容易设置您的构建以进行自动测试,部署到多个生产环境,与cruisecontrol集成以用于入口环境,与源代码控制集成.我们通过TFS/MSBuild(使用TFSDeployer,自定义PowerShell脚本等)经历了如此多的痛苦,以使它能够完成我们能够用NANT开箱即用的功能.不要浪费你的时间.

SO - NAnt与脚本:

构建产品远不仅仅是编译产品.由于这些工具(及其扩展)提供的功能,创建安装,更新版本号,创建托管,分发最终包等任务变得更加容易.虽然您可以使用常规脚本完成所有这些操作,但使用NAnt或MSBuild为您提供了一个可靠的框架来完成所有这些操作

msbuild nant build-process

10
推荐指数
1
解决办法
1602
查看次数

在一个人说话时识别段?

有没有人知道(最好是C#.Net)图书馆,它允许我在录音中找到特定人说话的那些片段?

speech-recognition

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

如何在WPF上显示图像更"干劲"?

我正在编写一个WPF图像查看器,显示一个图像网格.由于性能低下,我感到困惑:即使是一个11 x 11的网格,也会让VM在长时间内没有响应,缓慢而缓慢.即使在功能强大的主机上也能表现得非常活泼.

该程序基于SO WPF中的设计:在网格中安排集合项:ItemsControl绑定到Items,一个ObservableCollection.每个Item包含一个文件系统绝对URI.ItemsControl的DataTemplate包含一个Image元素,其Source绑定到URI.

似乎问题不能是磁盘(SSD),内存(8GB VM,24GB主机)或CPU(i750).此外,大部分工作都是由WPF完成的,因此我甚至不能在我的代码中找到问题:我的代码只是将URI(即图像的路径,而不是图像)加载到集合中并快速返回.然后有一个等待,WPF显示图像.

我能想到的唯一问题是图像处理 - WPF缩小比例.但即使在拥有"足够好"的5850 ATI Radeon HD卡的主机上,性能也不是很好.

所以,我的问题是:如何在WPF上显示图像更加"活泼"?

编辑:图像是从HD m2ts视频捕获的1920x1080 22位HD JPEG.我尝试将它们(使用FFmpeg)预缩放到'ega'640x350.有提高性能,但FFmpeg的按比例缩小的图像看起来比WPF的糟糕得多.

编辑:感谢David Osborne,代码现在以x64运行.仍然低迷.

编辑真正改善了这种情况的是MatějZábský所谓的scalling图像:降低分辨率.为了未来读者的利益:

            fullPath = new Uri(path, UriKind.Absolute);


            BitmapImage smallerBitmapImage = new BitmapImage();
            smallerBitmapImage.BeginInit();
            smallerBitmapImage.DecodePixelWidth = (int) (theWidthOfTheGrid / theNumberOfColumns);
            smallerBitmapImage.UriSource = fullPath;
            smallerBitmapImage.EndInit();

            FormatConvertedBitmap formatConvertedBitmap = new FormatConvertedBitmap();
            formatConvertedBitmap.BeginInit();
            formatConvertedBitmap.Source = smallerBitmapImage;
            formatConvertedBitmap.DestinationFormat = PixelFormats.Gray16;
            formatConvertedBitmap.EndInit();
            formatConvertedBitmap.Freeze();

            this.ImageSource = formatConvertedBitmap;
Run Code Online (Sandbox Code Playgroud)

wpf performance image

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

WPF位图性能

我试图理解为什么我的图像不够活泼,所以我构建了一个样本来测试WPF性能.我使用计时器来计算我的"显示图像"事件处理程序执行了多长时间,并使用秒表来测量图像在屏幕上显示的时间.底线:当显示100,1600,2500和3600张图像时,WPF 我的代码完成花了2,9,12和16秒屏幕上显示图像.所以我感到无助:似乎我无法改进我的代码以使图像显得更快 - 我需要用WPF做点什么!

所以我的问题是:我需要做些什么来使图像显示更快?


测试设置很简单:

该窗口包含一个网格.单击"测试"按钮后,将添加行和列定义.然后将图像添加到网格的每个单元格,如下所示:

            var image = new Image();
            image.BeginInit();
            image.Name = ImageNameFromCell(theRow, theColumn);
            image.Stretch = Stretch.None;
            image.HorizontalAlignment = HorizontalAlignment.Center;
            image.VerticalAlignment = VerticalAlignment.Center;
            RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality);
            image.EndInit();

            theGrid.Children.Add(image);
Run Code Online (Sandbox Code Playgroud)

最后,将每个图像的源设置为位图:灰度图像已经缩小到估计的屏幕尺寸.位图生成如下:

            var smallerBitmapImage = new BitmapImage();
            smallerBitmapImage.BeginInit();
            smallerBitmapImage.DecodePixelWidth = (int)(theImageWidth);
            smallerBitmapImage.UriSource = theUri;
            smallerBitmapImage.CacheOption = BitmapCacheOption.None;
            smallerBitmapImage.EndInit();

            //BitmapFrame bitmapFrame = BitmapFrame.Create(this.FullPath);

            var convertedBitmap = new FormatConvertedBitmap();
            convertedBitmap.BeginInit();
            convertedBitmap.Source = smallerBitmapImage;
            convertedBitmap.DestinationFormat = PixelFormats.Gray16;
            convertedBitmap.EndInit();
            convertedBitmap.Freeze();
Run Code Online (Sandbox Code Playgroud)

所以,我的智慧结束了.图像显示有明显的延迟,似乎不受我的控制.我能做什么?

wpf performance bitmap

8
推荐指数
1
解决办法
2794
查看次数

XML标记中的句点

现在学习XAML,我一直看到Object.Attribute格式的XAML标签.例如:

 <Deployment.OutOfBrowserSettings>
     OutOfBrowserSettings ShortName="Hello World" >
Run Code Online (Sandbox Code Playgroud)

不要记得以前看过这样的XML属性,总是会看到简单的单词,或者可能是名称空间列前缀,例如x:application.因此,为了表达上面的对象/属性关系,我希望有一个符号,如:

<Deployment>
   <OutOfBrowserSettings ShortName="Hello World" >
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:'.'的意义是什么?XML标记内的表示法.什么是语义?它是否特定于XAML?

xml xaml

7
推荐指数
1
解决办法
8108
查看次数