Tag: wpf

报告Async Task的进度

你好开发者, 我面临着一个轻微的困境。 我有一个WPF应用程序,它读取一个相当大的Excel文件,然后将其作为XML文件输出。 我面临的问题是我想将操作的进度报告给处理程序。 我无法让它“顺利”工作,字面意思是GUI线程中的进度条立即被填充,然后立即填充保存从Excel文件读取的内容的DataGrid。 我是Async / Await / Task的新手,我一直在使用BackgroundWorker,但我希望能够获得更多关于此的知识,所以如果这是一个愚蠢的问题,我很抱歉。 我从这里读过Stephen Cleary的教程。 老实说,我不知道为什么进度条不能“顺利”填充,因为它应该…… 在GUI中调用的代码: var progress = new Progress(progressPercent => pBar.Value = progressPercent); Task.Run(() => _sourceService.ReadFileContent(filePath, progress)).ContinueWith(task => { dataGrid.ItemsSource = task.Result.DefaultView; DataTable = task.Result; if (DataTable.Rows.Count > 0) BtnCreateXmlFile.IsEnabled = true; }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); ReadFileContent(filePath, progress)的方法体ReadFileContent(filePath, progress) : public DataTable ReadFileContent(string filePath, IProgress […]

慢速平移并放大WPF

我在WPF的几幅canvas上画了大量的文字和文字。 我在WPF中使用了最轻量级的元素: DrawingVisual 我在不同的canvas上绘制了线条,我将它们的thickness限制在缩放系数的倒数上,这样我就可以在缩放时获得均匀的线条粗细。 这意味着当我缩放时,我只是用线条重绘canvas。 带有文本的canvas仅在程序开始时创建。 现在我遇到了一个相当奇怪的问题。 当我缩放时,我的表现很慢。 当我使用虚线样式时性能变差。 像在一个单词中加载一个大文本文件时一样慢,滚动它时遇到问题! 我的第一个想法是,线条的创建可能花费太多。 由于我在每次变焦时创建它们(在鼠标滚轮上),所以我使用了一个适度的秒表来测量滚动鼠标滚轮直到线条创建结束之间的时间。 令我惊讶的是它只需要1毫秒! 因此,线条的创建不是问题。 经过进一步的检查,我发现在平移时我的表现相当缓慢! 当你试图在窗户中拍摄非常大的图像时,就像慢一样! 那可能是什么问题呢? 我知道你会想要一些代码,但由于代码很长,我只会展示Mousewheel事件中发生的事情: private void OnMouseWheel(object sender, MouseWheelEventArgs e) { var sw = new Stopwatch(); sw.Start(); var st = GetScaleTransform(Window); var tt = GetTranslateTransform(Window); var absoluteX = MousePos.Current.X * st.ScaleX + tt.X; var absoluteY = MousePos.Current.Y * st.ScaleY + tt.Y; […]

如何向Visual Studio扩展添加其他工具窗口?

为Visual Studio 2013创建扩展时,默认情况下会设置工具窗口。 但是,我想有一个第二个工具窗口,看不出应该怎么做。

使用调度程序更新WPF进度条

我正在尝试使用调度程序更新进度条,但不知何故无法考虑将调度程序放在何处。内部以及在其中传递的内容。 我试图导入文件,需要向用户显示使用进度条导入的文件数量。 所以我有一个代表: public delegate void DelegateA(ProgressClass progressClass); 我正在调用委托并传递函数来调用。 DelegateA(FunctionA); 因此,在导入每个文件时,它会调用FunctionA。 private void FunctionA(ProgressClass progressClass) { **//Put dispatcher.invoke here?** progressbar.updateprogress(progressclass); progressbar.show(); } progressclass有两个属性,用于设置进度条的值(已处理的数量)和要处理的项目总数。 我无法理解在InvokeMethod中传递的委托方法(THreadPriority,委托方法)? 对不起,如果有什么不清楚的话。

如何将图像文件绘制/叠加到位图图像?

我有一个Kinect传感器的video输入,该传感器由存储为位图的图像托管。 我的问题是如何将图像叠加到video源上,例如.png 。 video输入显示如下图所示为位图源,我知道如何在位图上绘制一条线但是如何从资源中绘制图像呢? KinectVideo.Source = BitmapSource.Create(colorFrame.Width, colorFrame.Height, 96, 96, PixelFormats.Bgr32, null, colorData, colorFrame.Width * colorFrame.BytesPerPixel); 下面是通过将图像放在video源上来模拟我想要实现的目标: 更新了绘图方法的实现,我不认为这是正确的实现我在将图像路径添加到.DrawImage时得到无效的参数错误: void myKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) { using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) { if (colorFrame == null) return; byte[] colorData = new byte[colorFrame.PixelDataLength]; colorFrame.CopyPixelDataTo(colorData); KinectVideo.Source = BitmapSource.Create(colorFrame.Width, colorFrame.Height, 96, 96, PixelFormats.Bgr32, null, colorData, colorFrame.Width * colorFrame.BytesPerPixel); Rect destRect2; […]

在ItemsControl中绑定上下文菜单?

如何将ContextMenu添加到ItemsControl,其中: ItemsControl的ItemsSource位于包含ItemsControl的UserControl的ViewModel中 Context Menu的CommandParameter是绑定到ItemsControl中Item的ViewModel。 我遵循这种方法 。 但是,我有一个Command,它从绑定到ItemsControl的ObservableCollection中删除项目。 发生这种情况时,会在RelayCommand中抛出exception。 在我看来,ContextMenu不是“隐藏”,所以它试图为其命令评估“CanExecute”,但是当项目被删除时,它不能在RelayCommand的CanExecute方法中将参数转换为“T”类。 我想知道如何完成我需要的正确方法。 到目前为止我的实施: MainViewModel public class MainViewModel { public ObservableCollection ContextMenuItems{ get;set; } public ObservableCollection MyItems{ get;set; } public void AddItem(MyItemClass item) { MyItems.Add(item); } public void AddContextMenuItem(MyContextMenuClass item) { ContextMenuItems.Add(item); } public MainViewModel(IList myItems, IList myContextualMenuItems) { MyItems.AddRange(myItems); ContextMenuItems.AddRange(myContextualMenuItems); } public MainViewModel() {} } MyItemClass public […]

WPF ComboBox绑定ItemsSource

我是WPF的初学者,并试图将ComboBox的Items绑定到ObservableCollection 我用过这段代码: XAML C# public MainWindow() { cmbTest.ItemsSource = cmbContent; cmbContent.Add(“test 1”); cmbContent.Add(“test 2”); InitializeComponent(); } public ObservableCollection cmbContent { get; set; } 在我尝试调试之前,我没有在此代码上出现任何错误,它会抛出错误: TargetInvocationError PresentationFramework.dll中出现未处理的“System.Reflection.TargetInvocationException”类型exception 谁能告诉我我做错了什么?

具有取消能力的长时间运行模式

为了执行长时间运行(让它在此上下文中搜索)操作,我将加载逻辑放在TPL任务中,因此在后台线程上调用通用方法Search() 。 Search()操作可以足够长,因此我需要能够使用CancellationToken正确取消它。 但是Search()操作直到完成才返回,所以我必须做一些逻辑才能实现方便和(!)快速取消。 使用WaitHandle我可以实现这样的事情: private void StartSearch() // UI thread { CancellationTokenSource s = new CancellationTokenSource(); Task.Factory.StartNew(() => StartSearchInternal(s.Token), s.Token) } private void StartSearchInternal(CancellationToken token) // Main Background Thread { ManualResetEvent eHandle = new ManualResetEvent(false); Task.Factory.StartNew(() => Search(eHandle ), TaskScheduler.Default); WaitHandle.WaitAny(new [] { eHandle, token.WaitHandle }); token.ThrowIfCancellationRequested(); } private IEnumerable Search(ManualResetEvent e) // Another […]

combobox中的默认文本

我在图像上有2个combobox,想知道是否可以为combobox设置某种文本字段(所以第一个框会说成员)。 这样我想摆脱combobox架上方的文本框。 我知道这可以通过将“成员”添加到数据集来完成,但我不想这样做。 还有另一种方式吗? BR

INotifyPropertyChanged和ObservableCollection WPF

现在我有一个只显示一个月的日历(我通过的月份)。 我试图让用户从comboBox中选择月份和年份并更新日历。 我使用observablecollection绑定,我很熟悉。 我不知道INotifyPropertyChanged如何工作。 我以前从未使用过它。 非常感谢任何帮助或建议。 这是我到目前为止: public class Schedule : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void Update(int propertyName) { if (propertyName != null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler.Invoke(this, new PropertyChangedEventArgs(propertyName.ToString())); } } // public void UpdateCal(PropertyChangedEventArgs e) // { // if (PropertyChanged != null) // PropertyChanged(this, e); […]