我想在ScrollViewer包装中创建以下行为ContentControl:
当ContentControl高度增长时,ScrollViewer应自动滚动到结尾.这很容易通过使用来实现ScrollViewer.ScrollToEnd().
但是,如果用户使用滚动条,则不应再进行自动滚动.这类似于VS输出窗口中发生的情况.
问题是要知道由于用户滚动而发生滚动的时间以及由于内容大小发生变化而发生滚动的时间.我试图用玩ScrollChangedEventArgs的ScrollChangedEvent,但不能让它开始工作.
理想情况下,我不想处理所有可能的鼠标和键盘事件.
我最近将我的应用程序从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输出.此外,每个进程都有自己的线程! …
我有一个用C#编写的win GUI应用程序,其中有一个TextBox我写日志的组件.在某些时候,它太过负载,整个应用程序开始动摇.我想建立一个有效的机制,使其成为一个FIFO,意思是 - 使其固定大小并自动删除最旧的内容.
这样做有什么.net/c#功能吗?否则,这样做的正确方法是什么?
更新:我还有其他类型的文本数据,而不仅仅是日志.因此,ListBox对我来说,这不是一个合适的解决方案.
我有一个.NET 4.5 WinForm程序,它使用ODBC查询基于文本的数据库.然后我想在多行文本框中显示每个结果,我想以最快的方式完成.
在更新/填充文本框期间,GUI不必是可用的.但是,如果我能更新进度条让用户知道发生了什么事情,那就太好了.我相信后台工作者或新线程/任务是必要的,但我从来没有实现过.
我最初使用这个代码并且它很慢,因为它在继续下一个之前每行都绘制了结果.
OdbcDataReader dbReader = com.ExecuteReader();
while (dbReader.Read())
{
txtDatabaseResults.AppendText(dbReader[0].ToString());
}
Run Code Online (Sandbox Code Playgroud)
这明显更快.
string resultString = "";
while (dbReader.Read())
{
resultString += dbReader[0].ToString();
}
txtDatabaseResults.Text = resultString;
Run Code Online (Sandbox Code Playgroud)
但是在文本框生效之前有一段慷慨的等待时间,所以我想知道操作是否可以更快.现在我从文件中获取大约7,000行,我认为没有必要切换到AvalonEdit(如果我的思维方式错误,请纠正我,但我想保持简单并使用内置文本框).
我想在应用程序执行的同时显示NLog跟踪RichTextBox
logger.Trace("This is a Trace message");
logger.Debug("This is a Debug message");
logger.Info("This is an Info message");
logger.Warn("This is a Warn message");
logger.Error("This is an Error message");
logger.Fatal("This is a Fatal error message");
Run Code Online (Sandbox Code Playgroud)
有NLog任何全球事件,所以有可能使用它并填充RichTextBox?
谢谢!
c# ×5
.net ×3
textbox ×2
wpf ×2
.net-3.5 ×1
nlog ×1
richtextbox ×1
winforms ×1
wpf-controls ×1