- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个更新文件的应用程序,然后最终将更新的文件导入数据库。我想显示有关正在更新哪个文件以及该过程何时完成的消息。我希望消息来自控制台,因为最终我使用的导入器库会通过控制台显示有用的消息,我也希望显示这些消息。我之前可以在 WPF 应用程序中执行此操作,但我的所有代码都在 View 后面的代码中,我想保留 MVVM 模式并将代码分离到 ViewModel 中。我的问题是我不知道如何获取对 View 中的 TextBox 的引用。一旦我能够在我的 ViewModel 中获得 TextBox,我将能够将控制台写入发送到 TextBox。
这是我的看法
<Window x:Class="DICOM_Importer.Views.StudyImporterView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DICOM_Importer.Views"
mc:Ignorable="d"
Background="Gold"
Title="Importer" Height="450" Width="800">
<Grid Style="{StaticResource gridBackground}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="125" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="280" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal">
<Label Style="{Binding Source={StaticResource studyTitle}}" Content="Study:" />
<Label Style="{Binding Source={StaticResource studyTitle}}" Name="StudyImportViewStudyText" Content="{Binding ImporterTitle}" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Orientation="Horizontal" >
<Label Style="{Binding Source={StaticResource studyTitle}}" Content="Import Directory" />
<Label Style="{Binding Source={StaticResource studyTitle}}" Content="{Binding ImporterPath}" />
</StackPanel>
<Button Grid.Column="2" Grid.Row="1" Command="{Binding ImportCommand}" Style="{Binding Source={StaticResource buttonStyleImport}}" Content="Submit" />
<TextBox Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="2" x:Name="ImportConsole" />
</Grid>
</Window>
using DICOM_Importer.Commands;
using DICOM_Importer.Views;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
namespace DICOM_Importer.ViewModels
{
public class StudyImporterViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private string importerTitle;
private string importerPath;
public DirectoryInfo[] directories;
GetIndividualSubjectDirectories subjectDirectories = new GetIndividualSubjectDirectories();
ConsoleOutputStream outputter;
/// <summary>
/// Gets the study information from the HomeView
/// </summary>
public String ImporterTitle
{
get { return importerTitle; }
set
{
importerTitle = value;
OnPropertyChanged("ImporterTitle");
}
}
public String ImporterPath
{
get { return importerPath; }
set
{
importerPath = value;
OnPropertyChanged("ImporterPath");
}
}
public StudyImporterViewModel()
{
ImportCommand = new ActivateImport(this);
outputter = new ConsoleOutputStream(ImportConsole); //Here is where the error is
Console.SetOut(outputter);
}
public ICommand ImportCommand
{
get;
private set;
}
public void Import()
{
MessageBoxResult result = MessageBox.Show("This will import every series in the Import Directory. Are you sure you want to Import?", "Import Confirmation", MessageBoxButton.OKCancel);
switch (result)
{
case MessageBoxResult.OK:
if(importerTitle == "SPIROMICS2")
{
Console.WriteLine("Importing SPIROMICS2 Scans to Mifar");
directories = subjectDirectories.GetSubjectDirectories(importerPath);
subjectDirectories.GetSeriesDirectories(directories);
Console.WriteLine("Import Complete");
}
else if(importerTitle == "BLF")
{
Console.WriteLine("BLF");
}
else if(importerTitle == "PRECISE")
{
Console.WriteLine("PRECISE");
}
break;
case MessageBoxResult.Cancel:
MessageBox.Show("CANCEL", "Nope!");
break;
}
}
#region Error Model
public string Error
{
get;
set;
}
#endregion
#region Error Definition
public string this[string columnName]
{
get
{
if (columnName == "ImporterTitle")
{
if (String.IsNullOrWhiteSpace(ImporterPath))
{
Error = "There is no selected study to import";
}
else
{
Error = null;
}
}
return Error;
}
}
#endregion
#region PropertyChangedEventHandler
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace DICOM_Importer.Commands
{
class ConsoleOutputStream : TextWriter
{
TextBox textBox = null;
public ConsoleOutputStream(TextBox ouput)
{
textBox = ouput;
}
public override void Write(char value)
{
base.Write(value);
textBox.Dispatcher.BeginInvoke(new Action(() => {
textBox.AppendText(value.ToString());
}));
}
public override Encoding Encoding
{
get { return System.Text.Encoding.UTF8; }
}
}
}
using DICOM_Importer.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace DICOM_Importer.Commands
{
/// <summary>
/// Starts the import processes on a button click if there is a study available
/// </summary>
class ActivateImport : ICommand
{
private StudyImporterViewModel _studyImporterViewModel;
public ActivateImport(StudyImporterViewModel viewModel)
{
_studyImporterViewModel = viewModel;
}
public event EventHandler CanExecuteChanged
{
//this is forcing the CommandManager to check the ICommand again. If we didn't have this then the buitton wouldl only be
//disabled if the window was loaded with a blank name, not if it was loaded with a name and then was deleted by the user
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return String.IsNullOrWhiteSpace(_studyImporterViewModel.Error);
}
public void Execute(object parameter)
{
_studyImporterViewModel.Import();
}
}
}
最佳答案
您可以将控制台输出重定向到 StringWriter
然后在每次生成新的控制台输出时将其内容写入绑定(bind)到文本框的字符串中。
查看型号
private StringWriter _sw;
public string ConsoleOut { /* getter and setter */ }
// inside constructor
_sw = new StringWriter();
Console.SetOut(sw);
Console.SetError(sw);
<TextBlock Text="{Binding Path=ConsoleOut, Mode=OneWay}"/>
S = _sw.ToString();
更新 S 的值。
StringWriter
每次写入时触发事件的类。有了这个,你只需要做一个简单的更新:
private StringWriterExt _sw;
public string ConsoleOut { /* getter and setter */ }
// inside constructor
_sw = new StringWriterExt(true);
Console.SetOut(sw);
Console.SetError(sw);
_sw.Flushed += (s, a) => ConsoleOut = _sw.ToString();
关于c# - WPF MVVM 控制台输出到 View 中的文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60567294/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!