相关疑难解决方法(0)

为何选择RelayCommand

我最近在WPF中编程很多,但我的View和ViewModel在这一点上并不是分开的.嗯,这是部分原因.我的所有绑定都与文本框中的文本,标签内容,数据网格中的列表,......相关,都是由常规属性完成的,其中包含NotifyPropertyChanged事件.

处理按钮点击或文本更改内容的所有事件都是通过链接事件来完成的.现在,我想开始使用命令并找到这篇文章:http://www.codeproject.com/Articles/126249/MVVM-Pattern-in-WPF-A-Simple-Tutorial-for-Absolute.它解释了如何设置MVVM,但我对它感到困惑RelayCommand.

它做了什么工作?它对我表单中的所有命令都可用吗?如果(a)某些文本框未填写,如何禁用该按钮?


编辑1:

对"我的表单中的所有命令都可用吗?"的一个很好的解释.在这里回答:https://stackoverflow.com/a/22286816/3357699

这是我到目前为止的代码:https://stackoverflow.com/a/22289358/3357699

c# wpf binding mvvm relaycommand

44
推荐指数
2
解决办法
6万
查看次数

WPF 中的屏幕截图不包含所有 UI 更新

我使用的代码这样做在WPF应用程序屏幕截图。简而言之:

var drawingvisual = new DrawingVisual();
using( DrawingContext context = drawingvisual.RenderOpen() )
{
  context.DrawRectangle( new VisualBrush( fooElement ), null, new Rect( fooElementSize ) );
  context.Close();
}
var r = new RenderTargetBitmap( ... );
r.Render( drawingvisual );
SaveBitmapToFile( r, .... );
Run Code Online (Sandbox Code Playgroud)

该原理工作得很好,例如在单击鼠标时调用时,但我在以编程方式调用它时遇到了问题。流程是:

  • 后台线程想要更​​新 UI 并使用 Application.Current.Dispatcher.Invoke
  • 后台线程做其他事情(这只需要一些毫秒)
  • 后台线程向它刚刚更新的 UI 的同一部分发出命令,再次使用 Application.Current.Dispatcher.Invoke

这在我的开发机器上工作正常,但在某些用户的机器上,这会导致保存的图像不包含所有更新。因此,例如,当 TextBlock 具有文本“running”并且上面的第一步将其设置为空字符串时,屏幕截图仍显示 TextBlock 的“running”。或者,如果第一步包括用一堆元素填充 Canvas,屏幕截图只是不包括它们。当要渲染的元素隐藏在其他窗口等后面时,情况也会变得更糟。

考虑到这一点,似乎关键问题是 WPF 使用单独的渲染线程,并且只有当该线程完成其工作时,UI 才会真正绘制并准备好捕获。四处搜索会产生一些点击,甚至一些“解决方案”围绕......

Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.ApplicationIdle,
  new Action( () => { } ) ).Wait();
Run Code Online (Sandbox Code Playgroud)

...但据我所知,这只是等到 UI 线程空闲,这并不能保证渲染线程已完成更新我想要捕获的 UI 部分?无论如何,在捕获代码之前在后台线程中插入这一行没有任何区别。有时似乎有效的方法只是将后台线程阻塞 100 …

c# wpf screenshot

6
推荐指数
0
解决办法
236
查看次数

标签 统计

c# ×2

wpf ×2

binding ×1

mvvm ×1

relaycommand ×1

screenshot ×1