在我的应用程序中,我有一个类似consonle的控件,该控件显示使用以下命令从各种功能发送的输出:
Run run = new Run("FancyText");
run.FontSize = 15;
run.FontFamily = new System.Windows.Media.FontFamily("Consolas");
run.Foreground = FancyColor;
tbConsole.Inlines.Add(run);
tbConsole.Inlines.Add(new LineBreak());
但是,这大大减慢了我的程序的速度... 我是在做错事,还是您可以期望的? (顺便说一句,如果我不是将Runs添加到Textbox中,而是使用Stackpanel并添加Textboxes,它可以正常且快速地运行)
答案 0 :(得分:0)
我从来没有能够像我想要的那样快地运行它,所以我想出了一种符合MVVM的不同方法。 我创建了一个虚拟的堆栈面板,以包含我创建并添加代码的文本框:
<ScrollViewer Grid.Column="2" Name="consoleScroll" Background="Black">
<ItemsControl ItemsSource="{Binding Log}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
代码:
public ObservableCollection<System.Windows.Controls.Control> Log
{
get { return (ObservableCollection<System.Windows.Controls.Control>)this.GetValue(LogProperty); }
set { this.SetValue(LogProperty, value); }
}
// Using a DependencyProperty as the backing store for Log. This enables animation, styling, binding, etc...
public static readonly DependencyProperty LogProperty =
DependencyProperty.Register(nameof(Log), typeof(ObservableCollection<System.Windows.Controls.Control>), typeof(ViewModel), new PropertyMetadata(default(ObservableCollection<System.Windows.Controls.Control>)));
//Code to call in a function
TextBox tb = new TextBox();
tb.Foreground = new SolidColorBrush(Colors.Hotpink);
tb.HorizontalContentAlignment = HorizontalAlignment.Left;
tb.Text = "my nice string";
Log.Add(tb);