如何将WPF控件放入Windows窗体表单?我很可能会将我的WPF控件插入到Windows.Forms.Panel中.
在上一个问题中,我问过如何在类似WPF文本框的元素中获取实时日志输出(WPF附加文本块大量阻止UI线程,但WinForms没有?).那里的答案让我使用了一个FlowDocumentScrollViewer,确实比它快得多RichTextBox.但是,我发现运行具有大量文本输出的命令(如'svn co')导致我的WPF应用程序明显减慢.检查3或4个非常大的svn分支后切换标签需要3-4秒,我确信时间会跟我检查的数量有关.滚动也有明显的滞后.
正如我在上面链接的问题中所述,我最近将我的应用程序从Windows窗体切换到了WPF.我非常喜欢WPF - 它提供了许多我在Forms中没有的优点.但是,性能似乎在WPF中是一个相当大的问题,至少在我看来.在我的应用程序的Forms版本中,我可以向RichTextBox控件打印大量文本,并且在我的应用程序中根本没有减速.切换标签是即时的,滚动是无缝的.这是我在WPF应用程序中想要的体验.
所以我的问题是:如何在不丢失粗体和斜体等格式化功能的情况下提高我的性能FlowDocumentScrollViewer以匹配Windows窗体的性能RichTextBox,而不会丢失复制/粘贴功能?我愿意切换WPF控件,只要它们提供我正在寻找的格式化功能.
这是我的打印代码,供参考:
public void PrintOutput(String s)
{
if (outputParagraph.FontSize != defaultFontSize)
{
outputParagraph = new Paragraph();
outputParagraph.Margin = new Thickness(0);
outputParagraph.FontFamily = font;
outputParagraph.FontSize = defaultFontSize;
outputParagraph.TextAlignment = TextAlignment.Left;
OutputBox.Document.Blocks.Add(outputParagraph);
}
outputParagraph.Inlines.Add(s);
if (!clearOutputButton.IsEnabled) clearOutputButton.IsEnabled = true;
}
public void PrintImportantOutput(String s)
{
if (outputParagraph.FontSize != importantFontSize)
{
outputParagraph = new Paragraph();
outputParagraph.Margin = new Thickness(0);
outputParagraph.FontFamily = font;
outputParagraph.FontSize = importantFontSize;
outputParagraph.TextAlignment …Run Code Online (Sandbox Code Playgroud) 当我在 IntelliJ Rider 中按住 Ctrl 键并单击某个方法或类时,我希望它会转到该类/方法。但是,它会弹出一个“选择目标”对话框,其中始终包含同一类的两个副本。在同一类的两个副本之间进行选择是一个非常愚蠢的步骤 - 有谁知道如何摆脱该类的第二个副本,以便我可以直接进入该类而不必选择?
以下行为的屏幕截图:
我在NetworkStream上使用BinaryReader从网络中读取数据.这对我来说非常有用,但我想了解幕后发生了什么,所以我看了一下BinaryReader的文档,发现它非常稀疏.
我的问题是:BinaryReader.ReadBytes(bufferSize)如果bufferSize我打电话时网络流上没有字节会怎么办ReadBytes?
在我看来,有几个选项:
1)读取网络流上存在的任何字节,只返回那么多
2)等待直到bufferSize流上出现字节,然后读取
3)抛出异常
我假设选项2正在发生,因为我从未收到任何例外,我的所有数据都是全部收到的,而不是碎片.但是,我想知道发生了什么.如果有人能够启发我,我将不胜感激.
我正在研究一种将非确定性有限状态自动机(NFA)转换为确定性有限状态自动机(DFA)的程序.为此,我必须计算具有epsilon转换的NFA中每个状态的epsilon闭包.我已经找到了一种方法来做到这一点,但我总是认为我想到的第一件事通常是效率最低的做事方式.
这是一个如何计算简单的epsilon闭包的例子:
转换函数的输入字符串:format是startState,symbol = endState
EPS是一个epsilon过渡
1,EPS = 2
新州的结果{12}
现在显然这是一个非常简单的例子.我需要能够从任意数量的状态计算任意数量的epsilon转换.为此,我的解决方案是一个递归函数,通过查看它具有epsilon转换的状态来计算给定状态的epsilon闭包.如果该状态具有(a)epsilon转换,则在for循环内递归调用该函数,以获得与其一样多的epsilon转换.这将完成工作,但可能不是最快的方法.所以我的问题是:在Java中计算epsilon闭包的最快方法是什么?
这是错误:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: sfclocator/UpdateNameForm
at sfclocator.SFCViewer.(SFCViewer.java:68)
at sfclocator.SFCViewer$10.run(SFCViewer.java:1823)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.lang.ClassNotFoundException: sfclocator.UpdateNameForm
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
Run Code Online (Sandbox Code Playgroud)
我创建了这个程序作为Netbeans 7.0项目.我已经工作了大约2-3天,并且昨天完成了.昨天工作得很好.我睡觉了,醒了,今天早上跑了,突然间我出错了.我修复了弹出的错误,除了这个错误.
该项目构建完美,JAR甚至运行得很好,但是当我尝试使用Netbeans运行项目时,它给了我这个错误.任何帮助,将不胜感激.
我刚刚发现的更多信息:
构建时,UpdateNameForm类存在于netbeans项目的classes文件夹中,但是当我单击运行时,它会删除 UpdateNameForm类.
在查看一个非常相似的问题并看到几乎相同的代码后,我决定分别提出这个问题.我想在DirectShow使用的默认窗口中显示网络摄像头视频流的视频预览,并且我还希望能够在任何给定时刻"拍摄"视频流.
我从MSDN上的DirectShow示例以及AMCap示例代码开始,并且我认为应该预览部分,但不是.我没有找到从视频流中抓取图像的例子,除了使用SampleGrabber,它已被弃用,因此我试图不使用它.
下面是我的代码,换行.请注意,EnumerateCameras中的大多数代码都已注释掉.该代码将用于附加到另一个窗口,我不想这样做.在MSDN文档中,它明确指出VMR_7创建自己的窗口来显示视频流.我的应用程序中没有错误,但此窗口永远不会出现.
我的问题是:我做错了什么?或者,如果您知道我想要做的一个简单示例,请将我链接到它.AMCap不是一个简单的例子,仅供参考.
注意:InitalizeVMR用于在无窗口状态下运行,这是我的最终目标(集成到DirectX游戏中).但是现在,我只想让它以最简单的方式运行.
编辑:此问题的第一部分,即预览相机流,已解决.我现在只是在寻找已弃用的SampleGrabber类的替代品,以便我可以随时拍摄照片并将其保存到文件中.
编辑:在谷歌搜索了近一个小时后,一般的共识似乎是你必须使用ISampleGrabber.如果您发现任何不同,请告诉我.
测试代码(main.cpp):
CWebcam* camera = new CWebcam();
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
MessageBox(NULL, L"text", L"caption", NULL);
if (SUCCEEDED(hr))
{
camera->Create();
camera->EnumerateCameras();
camera->StartCamera();
}
int d;
cin >> d;
Run Code Online (Sandbox Code Playgroud)
Webcam.cpp:
#include "Webcam.h"
CWebcam::CWebcam() {
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
//m_pTexInst = nullptr;
//m_pTexRes = nullptr;
}
CWebcam::~CWebcam() {
CoUninitialize();
m_pDeviceMonikers->Release();
m_pMediaController->Release();
}
BOOL CWebcam::Create() {
InitCaptureGraphBuilder(&m_pFilterGraph, &m_pCaptureGraph);
hr = m_pFilterGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaController);
return TRUE;
}
void CWebcam::Destroy() {
}
void CWebcam::EnumerateCameras() {
HRESULT hr = …Run Code Online (Sandbox Code Playgroud) 我最近将我的应用程序从WinForms转换为WPF,我对大多数新功能感到满意.然而,我遇到了一个重要的绊脚石.当我不断地将文本附加到我的文本框时,UI线程变得如此封闭,以至于我无法做任何事情,只是看它附加文本!我需要能够在我的选项卡控件,单击按钮等等中切换选项卡.奇怪的是,我在WinForms的UI线程中绝对没有减速!
所以,这里有一个关于我的应用程序的背景:它将其他进程作为"动作队列"的一部分运行,并将这些进程的stdout和stderr吐出到两个单独的文本框中,以及日志文本框(这些是受影响的文本框).在低输出进程中,没有减速,但是当我使用SVN checkout和文件复制等进程时,我会立即获得大量文本输出,它只能附加文本.
这是我的打印代码:
public void PrintOutput(String s)
{
String text = s + Environment.NewLine;
Window.Dispatcher.Invoke(new StringArgDelegate(Window.PrintOutput), text);
Debug.Log("d " + text);
}
public void PrintLog(String s)
{
ClearLogButtonEnabled = true;
String text = s + Environment.NewLine;
Window.Dispatcher.Invoke(new StringArgDelegate(Window.PrintLog), text);
}
Run Code Online (Sandbox Code Playgroud)
和匹配的代码隐藏:
public void PrintOutput(String s)
{
outputTextBox.AppendText(s);
outputTextBox.ScrollToEnd();
if (!clearOutputButton.IsEnabled) clearOutputButton.IsEnabled = true;
}
public void PrintLog(String s)
{
logTextBox.AppendText(s);
logTextBox.ScrollToEnd();
}
Run Code Online (Sandbox Code Playgroud)
这样我就没有得到一堆指责说我正在UI线程上做我的工作,这是我启动单独的工作线程的代码:
Thread actionThread = new Thread(new ThreadStart(ActionManager.Instance().ExecuteActions));
actionThread.Name = "Action Manager Work Thread";
actionThread.Start();
Run Code Online (Sandbox Code Playgroud)
这是处理所有辅助进程的启动,运行和清理的线程.这些进程使用上面显示的打印方法来打印它们的stdout/stderr输出.此外,每个进程都有自己的线程! …
我有以下代码:
public enum PortableTypes { Boolean, etc...};
public void testConversion() {
byte b = 5;
PortableTypes type = (PortableTypes)b;
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,我被告知这些是不可转换的类型.我不知道像java这样简单的东西会被遗漏掉.我错过了什么,或者Java根本不支持转换为枚举?我也用int进行了测试,但失败了.
如果不支持,最简单的解决方法是什么?
编辑:
由于每个人都在抱怨"糟糕的设计",我会进一步解释.我使用枚举来表示您可以使用我的TcpServer发送的类型.数据包以这种类型发送,在接收端我查看类型并使用它将从数据包读取的字节转换为可用数据.显然你不能使用OutputStream发送枚举,所以我需要将枚举值转换为要发送的数值.我不同意这是"糟糕的设计"这个想法,我认为Enums确实应该用于这个目的,但是这个设计在Java中不起作用,因为它是强类型的.
我正在使用Python 2.6。我使用dir_util.copy_tree函数复制文件,并且我想查看在命令行上复制了哪些文件。但是,即使我指定verbose = 1,它也不会将它们打印出来!这是一个已知的错误,还是我做错了什么?
这是我的代码:
distutils.dir_util.copy_tree(source, dest, verbose=1)
Run Code Online (Sandbox Code Playgroud) 我觉得我错过了一些非常明显的东西.
我知道表格一般都有一个Handle属性,但我使用的是a System.Windows.Controls.TextBox,它没有Handle属性.
我如何访问TextBox手柄?我注意到RichTextBox有Handle属性,所以为什么不经常TextBox?
在过去,我使用完整的初始化语法初始化了数组:
int[] arr = new int[1] { 1 };
Run Code Online (Sandbox Code Playgroud)
但是一旦我发现我在初始化期间不需要指定类型,我就停止这样做:
int[] arr = { 1 };
Run Code Online (Sandbox Code Playgroud)
我最近再次查看了锯齿状数组,并发现了这种语法的一个非常奇怪的问题:
int[][] jag = { { 1, 2 }, { 3 } };
Run Code Online (Sandbox Code Playgroud)
以上代码无效,令我困惑.此外,这种语法很好:
int[][] jag = { new []{ 1, 2 }, new []{ 3 } };
Run Code Online (Sandbox Code Playgroud)
显然,唯一的区别是"new"关键字.通常,在其他语言中,"new"关键字表示变量将成为引用类型,但在C#数组中始终是引用类型,因此实际上不需要为数组指定"new".有谁知道为什么我需要在这个锯齿状数组初始化中指定它?这是一个错误,还是只是一个未实现的编译器功能?
c# ×6
wpf ×4
java ×3
.net ×2
.net-3.5 ×2
windows ×2
arrays ×1
binaryreader ×1
byte ×1
c++ ×1
casting ×1
directshow ×1
enums ×1
netbeans-7 ×1
networking ×1
optimization ×1
performance ×1
python ×1
rider ×1
text ×1
textbox ×1
video ×1
webcam ×1