Tag: wpf

暂停新的BackGroundWorker直到上一次完成

我正在努力进行线程化。 问题是当我通过foreach循环迭代时。 设置this.Document ,应用程序执行登录,该事件由事件触发并需要几秒钟才能完成。 在worker_RunWorkerCompleted方法中,我需要执行一些依赖于当前登录信息的操作。 问题是,在我可以对第一个文件执行此操作之前, this.Document已经更改,使应用程序执行另一次登录。 这样我就无法实际执行我的操作。 我的问题是:如何在上一个线程完成之前暂停下一个线程。 我的问题还有其他解决办法吗? 我尝试使用AutoResetEvent但我没有运气。 我在RunWorkerAsync调用之后设置了waitOne() ,并在RunWorkerCompleted中设置了.Set() 。 代码永远不会到达RunWorkerCompleted …… 这是代码: public void Start(object obj) { try { foreach (KeyValuePair pair in this.CollectionOfFiles) { Worker = new BackgroundWorker(); Worker.DoWork += new DoWorkEventHandler(worker_DoWork); Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); using (Stream stream = pair.Value) { primaryDocument = new Document(stream); DataHolderClass dataHolder = […]

如何在wpf中获取多个项目的边界框?

我有几个项目,我想计算一个它们可以适合的最小矩形,但项目旋转到某种程度,或倾斜或两者。 那么我如何得到可以包含所有的最小矩形?

Windows服务启动和Exe

我目前正在开发一个包含WCF服务,Windows服务和WPF应用程序的项目。 Windows服务与WCF通信,在某种情况下,必须启动WPF应用程序以便用户接收消息。 (WCF位于远程服务器上,其余位于客户端上)。 我在发布时遇到了一些障碍。 我有服务将消息写入应用程序日志,以便我可以在某种程度上“调试”。 Windows服务运行以下代码没有问题。 C#代码,Windows服务: WriteLog.WriteString(“PostOffice.MessagesWaiting: Inside, starting up.”, EventLogEntryType.Warning); // Call the WPF Application var messagingProcess = new Process(); var messageProcessStartInfo = new ProcessStartInfo(@”””C:\GoldenEyeMessages.exe”””); messageProcessStartInfo.CreateNoWindow = false; messageProcessStartInfo.UseShellExecute = false; messageProcessStartInfo.FileName = @”””C:\GoldenEyeMessages.exe”””; messageProcessStartInfo.WindowStyle = ProcessWindowStyle.Normal; messageProcessStartInfo.Verb = “runas”; messageProcessStartInfo.RedirectStandardOutput = true; messagingProcess.StartInfo = messageProcessStartInfo; messagingProcess.Start(); StreamReader daStreamReaderMan = messagingProcess.StandardOutput; string newString […]

带有AutoGenerateColumns的WPF Datagrid中的ItemTemplateSelector

在我们的数据网格中,我们使用ItemTemplateSelector根据绑定到特定单元格的数据在两个数据模板之间切换。 由于列数取决于当前数据集,我们在DataGrid使用AutoGenerateColumns 。 似乎这种特殊组合效果不佳 – 甚至没有调用模板选择器。 我们可以在自动创建列的数据网格中使用模板选择器吗? 更具体地说:这是否可以使用XAML而不将逻辑放入代码隐藏文件或使用自定义行为? 我们的数据网格定义相当简单: 项模板选择器定义 :

处理WPF菜单HeaderStringFormat和Access Keys等

好的。 所以我希望我的应用程序在其主菜单中显示“保存”和“另存为…”项目,就像Visual Studio一样; 即“保存{当前文件}”和“保存{当前文件}为…” 我还想拥有普通的访问密钥(分别为“S”和“A”)。 我想出了两个解决方案,但两者都不是很理想。 我可以在MainWindowViewModel中创建所有主菜单,而不是仅在xaml中创建主菜单,因此我可以完全控制生成的MenuItems中的内容。 但是,我觉得这会违反MVVM(我这次试图非常严格地遵守),因为我必须在ViewModel中包含对每个MenuItem图标的引用。 再加上看起来有点凌乱。 我可以像这样规定这两个特定的MenuItem(以及可能是未来的)的标题,但后来我最终获得了一个MenuItem,它不仅在标题中有下划线,而且还不包含访问键。 我该怎么办?

CanExecute-Result确实更改后,控件不会刷新

在我的窗口中,我有加载和保存方法的按钮。 我使用CommandBinding,并且save-button具有CanExecute属性,以防止用户在加载数据之前保存数据。 CanExecute-Methode连接到一个名为“canSaveXML”的简单bool值 private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if (canSaveXML == false) { e.CanExecute = false; } else { e.CanExecute = true; } e.Handled = true; } 我的意图是在加载数据后设置canSaveXML = true,但在值发生更改后控件不会刷新。 我做了一些阅读,发现我必须调用CommandManager.InvalidateRequerySuggested。 我现在就这样做,我的代码看起来像这样。 canSaveXML = true; CommandManager.InvalidateRequerySuggested(); 但控件(按钮)仍然不刷新。 我仍然被禁用,直到我在UI上触发任何内容或最小化/最大化窗口。 我这样做后按钮启用。 这有什么不对? 在MSDN示例中,一次又一次地使用dispatchertimer调用CommandManager.InvalidateRequerySuggested,但我拒绝相信这将是唯一的解决方案。

PresentationFramework.dll中出现未处理的“System.Windows.Markup.XamlParseException”类型exception

我正在使用C#/ WPF中的一个小应用程序,该应用程序由来自串行端口的数据提供。 它还会读取包含一些常量的文本文件以便计算某些内容。 事件处理程序在到达时处理传入的数据: _serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Receive); 这是Receive处理程序,以及在Dispatcher中创建的委托,以进一步更新UI。 private delegate void UpdateUiTextDelegate(string text); private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { // collect characters received to our ‘buffer’ (string) try { // stops long running output timer if enabled if (dispatcherTimer.IsEnabled) { dispatcherTimer.Stop(); } message = _serialPort.ReadLine(); dispatcherTimer.Start(); Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(updateUI), message); } catch (Exception […]

如何使用WPF窗口作为消息框?

我创建了一个带有一些风格的小窗口。 现在我想像MessageBox一样使用它。 我怎样才能实现它? 编辑:我是WPF的新手。 我尝试在主窗口中调用它。 Window1 messageBox = new Window1(); messageBox.Show(); messageBox.Activate(); 问题是新生成的窗口在主窗口后面消失,而不让我点击其中的操作按钮。

WPF DataGrid删除IEditableCollectionView.CancelNew()上的NewItemPlaceholder

概观 我正在开发一个WPF应用程序(使用.NET 4.5),其中一部分涉及在DataGrid中显示一些数据。 用户可以在DataGrid中添加新行,并通过其他位置的按钮删除一行。 当用户开始添加无法提交的新行然后按下删除按钮时,我遇到了问题。 应取消新行,并将DataGrid重置为其先前的状态。 但是,DataGrid的NewItemPlaceholder行将被删除,并且不再显示。 我做了一个示例项目来演示这个问题。 这是一个简短的截屏video。 这就是示例应用程序的样子。 重现: 双击最上面一行的价格单元格 输入无效的数字以通过例外触发validation (可选)选择另一行 单击“删除”按钮 码 viewmodel获取ObservableCollection中的数据,ObservableCollection用作集合视图的源。 我有一个简单的命令连接到删除按钮。 如果用户正在添加项目( IEditableCollectionView.IsAddingNew ),我尝试在collectionView上使用.CancelNew()取消操作。 但是,当命令完成时,DataGrid NewItemPlaceholder删除其NewItemPlaceholder 。 到目前为止,我已经尝试过: 触发DataGrid以通过设置dataGrid.CanUserAddRows = true再次显示占位符,这有点修复了问题,但这是一个可怕的解决方法并且它是错误的,之后占位符不可编辑。 从源集合中删除无效项: this.productsObservable.Remove(this.Products.CurrentAddItem as Product) 。 这不会改变行为,占位符仍然被删除。 从集合视图中删除该项: this.Products.Remove(this.Products.CurrentAddItem) 。 这会引发exception,这是有道理的: ‘Remove’ is not allowed during an AddNew or EditItem transaction. 有没有其他方法可以取消用户的添加并显示NewItemPlaceholder? 在示例项目中,为了简单起见,我在VM构造函数中实例化数据。 实际上我正在使用对服务的异步调用,将结果包装在ObservableCollection中,而ViewModel实现了INotifyPropertyChanged。 业务对象未实现INPC。 示例项目的XAML: ViewModel,以及一个简单的业务对象: using […]

MVVM关闭文件的方式有可能取消出来

我正在使用Avalondock 2.x作为我的一个开源项目,如果你关闭它时文档很脏,你应该可以取消关闭。 我正在使用Caliburn Micro和Coroutine,只有我能够解决它的方法是使用CM附加到事件 事件arg有取消属性。 这个approuch的问题是它不是很MVVM友好,我已经创建了一个小帮手方法来Coroutinify这个像 public IEnumerable Coroutinify(IEnumerable results, System.Action cancelCallback) { return results.Select(r => { if (r is CancelResult) cancelCallback(); return r; }); } 用过像 public IEnumerable DocumentClosing(ScriptEditorViewModel document, DocumentClosingEventArgs e) { return Result.Coroutinify(HandleScriptClosing(document), () => e.Cancel = true); } 这有效,但它有点笨拙等,是否有更多的MVVM方式关闭Avalondock的文件取消能力? 编辑:源代码 https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Shells/MainShellView.xaml#L29 https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Shells/MainShellViewModel.cs#L110 https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Result/ResultFactory.cs#L49