社区首页 >问答首页 >在加载用户控件时显示“用户控件正在加载”消息

在加载用户控件时显示“用户控件正在加载”消息
EN

Stack Overflow用户
提问于 2012-08-08 01:37:51
回答 3查看 2.7K关注 0票数 1

我有一个带有TabStrip控件的Winforms应用程序。在运行时,UserControls将动态加载到不同的选项卡中。

我希望在加载UserControl之前,并在加载完成之前,向用户显示一条“UserControl正在加载”消息(将现有标签设置为可见并更改其文本)。

到目前为止,我的方法是:

  1. 试图在BackgroundWorker线程中加载用户控件。这将失败,因为我必须在加载UserControl期间访问Gui控件。
  2. 试图在BackgroundWorker线程中显示消息。这显然失败,因为BackgroundWorker线程不是UI线程;-)
  3. 显示消息,调用DoEvents(),加载UserControl。这导致了不同的行为(闪烁,.)每次加载UserControl时,我都无法控制何时以及如何再次将其设置为不可见。

总之,我有两个问题:

  1. 如何在加载用户控件之前确保消息是直接可见的
  2. 如何确保消息再次设置为不可见,就在UserControl完全加载时(包括所有DataBindings、网格格式等)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-08 01:49:47

我们使用的内容与此类似:

  1. 创建一个新表单,该表单具有您想要向用户显示的任何内容,
  2. 实现一个静态方法,在该方法中可以调用要在其内部创建的表单,以防止内存泄漏。
  3. 在此表单中创建一个新线程,以便表单在分离的线程中运行,并保持响应;我们使用一个ajax控件,它显示一个进度条填充。

在用于启动线程的方法中,将其属性设置为topmost,以确保线程保持在顶部。

例如,在您的主表单中这样做:

代码语言:javascript
代码运行次数:0
复制
loadingForm.ShowLoadingScreen("usercontrollname");
//do something
loadingform.CloseLoadingScreen();

在加载形式类中;

代码语言:javascript
代码运行次数:0
复制
public LoadingScreen()
{
  InitializeComponent();
}

public static void ShowLoadingScreen(string usercontrollname)
{
  // do something with the usercontroll name if desired
  if (_LoadingScreenThread == null)
  {
    _LoadingScreenThread = new Thread(new ThreadStart(DoShowLoadingScreen));
    _LoadingScreenThread.IsBackground = true;
    _LoadingScreenThread.Start();
  }
}

public static void CloseLoadingScreen()
{
  if (_ls.InvokeRequired)
  {
    _ls.Invoke(new MethodInvoker(CloseLoadingScreen));
  }
  else
  {
    Application.ExitThread();
    _ls.Dispose();
    _LoadingScreenThread = null;
  }
}

private static void DoShowLoadingScreen()
{
    _ls = new LoadingScreen();
    _ls.FormBorderStyle = FormBorderStyle.None;
    _ls.MinimizeBox = false;
    _ls.ControlBox = false;
    _ls.MaximizeBox = false;
    _ls.TopMost = true;
    _ls.StartPosition = FormStartPosition.CenterScreen;

  Application.Run(_ls);
}
票数 3
EN

Stack Overflow用户

发布于 2012-08-08 01:53:45

再次尝试您的第二种方法:

试图在BackgroundWorker线程中显示消息。这显然失败,因为BackgroundWorker线程不是UI线程;-)

但这一次,在后台线程中使用以下代码来更新标签:

代码语言:javascript
代码运行次数:0
复制
label.Invoke((MethodInvoker) delegate {
    label.Text = "User Control xyz is loading";
    label.Visible = true;
});
// Load your user control
// ...
label.Invoke((MethodInvoker) delegate {
    label.Visible = false;
});

Invoke允许您在另一个线程中更新UI。

票数 1
EN

Stack Overflow用户

发布于 2013-03-27 23:27:42

通过使用@wterbeek的示例,我为自己的目的修改了类:

  • 在加载表单上居中
  • 其不透明度的修正
  • 将其大小调整到父大小
  • 将其显示为对话框并阻止所有用户交互。

  • 我被要求给一个跳动的人表演

我在网上收到了一个空错误:

代码语言:javascript
代码运行次数:0
复制
if (_ls.InvokeRequired)

因此,我添加了一个_shown条件(如果操作完成得太快以至于_LoadingScreenThread线程甚至没有运行)来检查表单是否存在。

另外,如果_LoadingScreenThread未启动,Application.Exit将关闭主线程。

我想把它发出去,因为它可能对别人有帮助。代码中的注释将解释更多。

代码语言:javascript
代码运行次数:0
复制
public partial class LoadingScreen : Form {

    private static Thread _LoadingScreenThread;

    private static LoadingScreen _ls;

    //condition required to check if the form has been loaded
    private static bool _shown = false;

    private static Form _parent;

    public LoadingScreen() {
        InitializeComponent();
    }
    //added the parent to the initializer
    //CHECKS FOR NULL HAVE NOT BEEN IMPLEMENTED
    public static void ShowLoadingScreen(string usercontrollname, Form parent) {
        // do something with the usercontroll name if desired
        _parent = parent;
        if (_LoadingScreenThread == null) {
            _LoadingScreenThread = new Thread(new ThreadStart(DoShowLoadingScreen));
            _LoadingScreenThread.SetApartmentState(ApartmentState.STA);
            _LoadingScreenThread.IsBackground = true;
            _LoadingScreenThread.Start();
        }
    }

    public static void CloseLoadingScreen() {
        //if the operation is too short, the _ls is not correctly initialized and it throws 
        //a null error
        if (_ls!=null && _ls.InvokeRequired) {
            _ls.Invoke(new MethodInvoker(CloseLoadingScreen));
        } else {
            if (_shown)
            {
                //if the operation is too short and the thread is not started
                //this would close the main thread
                _shown = false;
                Application.ExitThread();
            }
            if (_LoadingScreenThread != null)
                _LoadingScreenThread.Interrupt();
            //this check prevents the appearance of the loader
            //or its closing/disposing if shown
            //have not found the answer
            //if (_ls !=null)
            //{
               _ls.Close();
               _ls.Dispose();
            //}
            _LoadingScreenThread = null;
        }
    }

    private static void DoShowLoadingScreen() {
        _ls = new LoadingScreen();
        _ls.FormBorderStyle = FormBorderStyle.None;
        _ls.MinimizeBox = false;
        _ls.ControlBox = false;
        _ls.MaximizeBox = false;
        _ls.TopMost = true;
        //get the parent size
        _ls.Size = _parent.Size; 
        //get the location of the parent in order to show the form over the 
        //target form
        _ls.Location = _parent.Location;     
        //in order to use the size and the location specified above
        //we need to set the start position to "Manual"
        _ls.StartPosition =FormStartPosition.Manual;
        //set the opacity
        _ls.Opacity = 0.5;
        _shown = true;
        //Replaced Application.Run with ShowDialog to show as dialog
        //Application.Run(_ls);
        _ls.ShowDialog();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11861701

复制
相关文章
R中轻松绘制南丁格尔图
R语言数据分析指南
2023/09/29
3090
R中轻松绘制南丁格尔图
「R」使用forestplot绘制森林图
森林图常见于元分析,但其使用绝不仅如此,比如我现在想要研究的对象有诸多HR结果,我想要汇总为一张图,森林图就是个非常好的选择。ggpubr包提供的森林图是针对变量分析绘图,我也尝试使用了metafor包的forest画图函数,但太灵活了,我除了感觉文档画的不错,但实际使用却很难得到想要的结果。
王诗翔呀
2020/07/02
8.2K0
R中优雅的绘制物种冲积图
购买后微信发小编订单截图即邀请进新的会员交流群,小编的文档为按年售卖,只包含当年度的除系列课程外的文档,有需要往年文档的朋友也可下单购买,需要了解更多信息的朋友欢迎交流咨询。
R语言数据分析指南
2023/06/12
7730
R中优雅的绘制物种冲积图
R中优雅的绘制物种冲积图
R语言数据分析指南
2023/08/18
2830
R中优雅的绘制物种冲积图
R中优雅的绘制环状sina图
❝在R中创建sina图使用geom_sina函数,sina图是一种用于显示单个分类变量的每个观测值的图形。它与箱线图和小提琴图类似,但是它显示了每个单独的数据点,这可以提供关于数据分布的更多信息。 ❞
R语言数据分析指南
2023/09/27
3480
R中优雅的绘制环状sina图
「R」使用NMF包绘制热图
学习文档: https://cran.r-project.org/web/packages/NMF/vignettes/heatmaps.pdf
王诗翔呀
2020/07/03
2.9K0
如何在R中绘制树图(TreeMap)
本文介绍了如何利用R语言中的Treemap函数绘制树图,并给出了一个实例,包括使用安装包、设定颜色范围、边框颜色、节点大小、填充颜色等参数。同时还介绍了两种方法,一是通过aggregate函数对数据进行分组,二是通过手动设置index和vSize、vColor、type等参数来绘制树图。
Erin
2018/01/09
5.3K0
如何在R中绘制树图(TreeMap)
使用R语言绘制SCI插图云雨图
我们使用r语言中ggplot2包绘制云雨图,云雨图可以看做是核密度估计曲线图、箱线图和抖动散点图的组合图表。我们可以使用自定义的半小提琴函数geom_flat_volin()、箱型图函数geom_boxplot和抖动散点图函数geom_jitter()叠加实现。
你像时光唯美i
2022/12/28
1K0
使用R语言绘制SCI插图云雨图
R中轻松绘制树状热图的若干方法
R语言数据分析指南
2023/08/18
4810
R中轻松绘制树状热图的若干方法
R 热图绘制heatmap①
R.package heatmap():用于绘制简单热图的函数 heatmap.2():绘制增强热图的函数 d3heatmap:用于绘制交互式热图的R包 ComplexHeatmap:用于绘制、注释和排列复杂热图的R&bioconductor包(非常适用于基因组数据分析) 首先使用ggplot2画简单热图 data <- as.data.frame(matrix(rnorm(9*10),9,10)) rownames(data) <- paste("Gene", 1:9, sep="_") colnam
用户1359560
2018/08/27
1.1K0
R 热图绘制heatmap①
R语言绘制Circos图
Circos图加拿大的生物信息科学家 Martin Krzywinski 开发的,最初主要用于基因组序列相关数据的可视化。现在越来越多的领域把Circos图引入其中。今天我们介绍在R语言中如何绘制Circos图。
一粒沙
2019/07/31
5.8K0
R EnhancedVolcano 绘制火山图
火山图是用于差异表达分析结果可视化的一种有效方法。今天,我们来介绍一个用于增强火山图绘制的强大 R 包:EnhancedVolcano ,该包拥有强大的绘图功能,用户可以简单的通过设置颜色、形状、大小和阴影等参数定义不同的绘图属性,此外通过可以通过添加连线的方式有效避免数据点之间的重叠现象。使用 EnhancedVocalno 包绘制的火山图基本可以直接用于文献发表,可以说非常简单又实用的一款神器了。
王诗翔呀
2020/07/06
6.3K0
R EnhancedVolcano 绘制火山图
如何使用 Python 只删除 csv 中的一行?
我们将使用 drop() 方法从任何 csv 文件中删除该行。在本教程中,我们将说明三个示例,使用相同的方法从 csv 文件中删除行。在本教程结束时,您将熟悉该概念,并能够从任何 csv 文件中删除该行。
很酷的站长
2023/08/11
8280
如何使用 Python 只删除 csv 中的一行?
R绘制网络图
对于网络图,其实我们并不陌生,用的比较普遍的是Cytoscape这个软件。不过,我们今天的主角是R包---igragh。相比Cytoscape,igragh的便利之处就是你不用趴在电脑上很痛苦的去一一调整节点的大小,颜色等属性。接下来,我就开启小白学习之旅了。
生信交流平台
2020/08/05
2K0
R EnhancedVolcano 绘制火山图
火山图是用于差异表达分析结果可视化的一种有效方法。今天,我们来介绍一个用于增强火山图绘制的强大 R 包:EnhancedVolcano ,该包拥有强大的绘图功能,用户可以简单的通过设置颜色、形状、大小和阴影等参数定义不同的绘图属性,此外通过可以通过添加连线的方式有效避免数据点之间的重叠现象。使用 EnhancedVocalno 包绘制的火山图基本可以直接用于文献发表,可以说非常简单又实用的一款神器了。
章鱼猫先生
2021/10/15
1.3K0
R EnhancedVolcano 绘制火山图
R语言绘制箱图
箱图 简单点数就是像一个箱子的图,用于表征数据的分布。 百度定义:箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的最大值、最小值、中位数和两个四分位数;然后, 连接两个四分位数画出箱子;再将最大值和最小值与箱子相连接,中位数在箱子中间。 数据 使用R自带的数据 代码 导入数据,不想解释各行各列
DrugScience
2021/02/04
1.2K0
R语言绘制箱图
「R」R传统图形绘制多图
mfrow 和 mfcol 都由 2 个数字指定,一个表示行数、一个表示列数。如果使用 mfrow,那么图像区域会被按行依次使用;如果使用 mfcol,那么图像区域会按列依次使用。
王诗翔呀
2020/07/06
7210
「R」R传统图形绘制多图
R 热图绘制heatmap②
使用pheatmap包绘制热图 一般而言,pheatmap较heatmap.2等更为简洁以及易于理解,对于初学者而言是一款不错的热图绘制软件。 rm(list=ls()) setwd("E:\\Rwork") library(pheatmap) #创建数据集test测试矩阵 test = matrix(rnorm(400), 20, 20) colnames(test) <- paste("sample",1:20,sep = "") rownames(test) <- paste("ge
用户1359560
2018/08/27
1.4K0
R 热图绘制heatmap②
R语言绘制森林图
在Meta分析中森林图比较常见,其主要是是以统计指标和统计分析方法为基础,用数值运算结果绘制出的图型。它在平面直角坐标系中,以一条垂直的无效线(横坐标刻度为1或0)为中心,用平行于横轴的多条线段描述了每个被纳入研究的效应量和可信区间,用一个棱形(或其它图形)描述了多个研究合并的效应量及可信区间。它非常简单和直观地描述了Meta分析的统计结果,是Meta分析中最常用的结果表达形式。
一粒沙
2019/07/31
8.1K0
Python使用csv模块读写csv文件
有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。
Python碎片公众号
2021/02/26
3.5K0
Python使用csv模块读写csv文件

相似问题

用R从多个.csv文件绘制多个图

24

使用csv在R上绘制多列图

11

从csv文件中绘制蜡烛图

13

绘制[r]中列和行的循环图

10

使用matplotlib从CSV文件中绘制实时图形图

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文