【C#学习】如何实现子窗口按下设置按钮后刷新父窗口内容?
本帖最后由 独自旅行 于 2021-5-26 10:38 编辑小程序设计为【主窗口】的TextBox只能读INI文件不能写,【子窗口.设置窗口】的TextBox文件可读INI、可写INI。
但是问题来了——如何让【主窗口】在后台持续刷新读取INI文件?
委托 该用户不存在 发表于 2021-5-26 10:48
循环命令
—— 来自 Hisense HLTE203T, Android 10上的 S1Next-鹅版 v2.4.4.1
循环命令让程序陷入死循环。 做个数据绑定就行了,查下INotifyPropertyChanged 垃圾点循环定时读文件、读文件元数据
高级点么类似Linux 的 inotify 机制在 Windows 中也有对应的 FindFirstChangeNotification API
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364417(v=vs.85).aspx dpheix1 发表于 2021-5-26 11:16
做个数据绑定就行了,查下INotifyPropertyChanged
这个好。 本帖最后由 DTCPSS 于 2021-5-26 12:36 编辑
INotifyPropertyChanged 的实现可以用 https://github.com/Fody/PropertyChanged 来做编译期织入,不用手动去触发事件了。
这项目 1400 星。.Net 5 的 Source Generator 也拿这个场景做 demo case。可见天下苦 XAML 久矣 对了,问个事情哈。
我举个例子,子窗口格式大概是这样的:
{
子窗口 子= new 子窗口();
子.showdialo();
}
下班前翻了一下发现有其他后缀:子.Close或者子.FormClose。
怎么用啊这两个后缀? 粗暴一点你子窗口不要卡死主窗口不就行了 real_zyf 发表于 2021-5-26 18:28
粗暴一点你子窗口不要卡死主窗口不就行了
操作子窗口时关闭了主窗口的事情我没设想过,也在避免发生这个事情…… delegate 本帖最后由 独自旅行 于 2021-5-27 17:18 编辑
看书发现INotifyPropertyChanged可以实现对流文件监控,所以想使用监控事件来触发重新读取INI文件。
但是它报错啊!
同样的功能(),按钮触发就正常运转,自动监控就报错。
懵了。如果按下面这么写,就会跳错『$exception {"线程间操作无效: 从不是创建控件“socpath”的线程访问它。"} System.InvalidOperationException』
===========================================================================
private void Form1_Load(object sender, EventArgs e)
{
LoadINI();
UsingFileSystemWatcher();
}
void LoadINI();
{
str = Application.StartupPath + "\\ConnectString.ini"; //INI文件的物理地址
strOne = System.IO.Path.GetFileNameWithoutExtension(str); //获取INI文件的文件名
if (File.Exists(str)) //判断是否存在该INI文件
{
str_group = ContentReader(strOne, "Group", ""); //读取INI文件中组名称
str_job = ContentReader(strOne, "Server task", ""); //读取INI文件中服务器任务
str_soc = ContentReader(strOne, "Source Path", ""); //读取INI文件中源文件夹
str_opt = ContentReader(strOne, "Output path", ""); //读取INI文件中输出文件夹
str_ftpsvr = ContentReader(strOne, "FTP address", ""); //读取INI文件中FTP服务器的内容
}
Group.Text = str_group; //显示INI文件中组名称
job.Text = str_job; //显示INI文件中服务器任务
socpath.Text = str_soc; //显示INI文件中源文件夹
optpath.Text = str_opt; //显示INI文件中输出文件夹
}
void UsingFileSystemWatcher()
{
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
fileSystemWatcher.Path = Application.StartupPath; //设置监控的文件目录
fileSystemWatcher.IncludeSubdirectories = false; //设置监控目标目录下的所有子目录
fileSystemWatcher.Filter = "*.ini"; //设置监控文件的类型
fileSystemWatcher.Changed += FileSystemWatcher_Changed; //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
fileSystemWatcher.EnableRaisingEvents = true; //启动监控
}
void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
LoadINI();
}
===========================================================================
但是如果写成下面这样使用按钮人工触发的话又是正常运转的。
怎么治它啊?我想借助流文件监视来实现自动载入……
private void button1_Click(object sender, EventArgs e)
{
LoadINI();
}
不能在非UI线程里直接更新UI元素,得用Control.BeginInvoke或Control.Invoke 本帖最后由 独自旅行 于 2021-5-28 09:13 编辑
hourousha 发表于 2021-5-27 17:21
不能在非UI线程里直接更新UI元素,得用Control.BeginInvoke或Control.Invoke
啊,原来如此。多谢指教。
————————————————后续更新————————————————————
干!成功解决问题!
页:
[1]