首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >picturebox中的动画gif随委托子和后台线程的可见性变化

picturebox中的动画gif随委托子和后台线程的可见性变化
EN

Stack Overflow用户
提问于 2017-12-01 18:07:18
回答 1查看 470关注 0票数 0

我在主表单中有一个Telerik RadRibbonBar,其中有许多按钮。其中一些按钮使表单中的某些面板可见,除RadRibbonBar及其按钮外,该面板填充了所有主窗体。

这些面板有一些形式是动态计算的,它们需要在0秒到2-3分钟内打开。因此,我们决定在一个面板和一个带有动画gif的PictureBox之间放置一个表单。我的问题是,一旦我将动画gif的新表单设置为.visible = False,就无法从图片框中显示动画gif。

我在这里放了一些代码看看是否有人能帮我。

代码语言:javascript
复制
Public Sub MICommand1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MICommand1.Click
    cargando = True
    makevisiblePanel(1)
    azkenpanelzenbakia = 1
    cargando = False
End Sub
Public Sub MICommand2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MICommand2.Click
    cargando = True
    makevisiblePanel(2)
    azkenpanelzenbakia = 2
    cargando = False
End Sub

等等还有很多其他的按钮。现在,makevisiblePanel(作为整数的字节面板)

代码语言:javascript
复制
Private Sub makevisiblePanel(ByVal panel As Integer)
    rf.Visible = True
    If Not loaded Then
        makeeverypanelInvisible()
        firstCallPanelInLoad(panel)
        rf.Visible = False
    Else
        makeeverypanelInvisible()
        backgroundworkerRA(panel)
    End If
End Sub

后台工作人员的定义如下:

代码语言:javascript
复制
Private Sub backgroundworkerRA(ByVal panel As Integer)
    Dim t As New Threading.Thread(Sub() selectVisiblePanel(zein))
    t.IsBackground = True
    t.Start()
End Sub
Private Sub selectVisiblePanel(ByVal zein As Integer)
    selectVisiblePanel_threadasko_rf()
    Select Case zein
        Case 0
            selectVisiblePanel_threadasko_P10()
            selectVisiblePanel_threadasko_Rp()
        Case 1
            selectVisiblePanel_threadasko_P1()
            selectVisiblePanel_threadasko_Rd1()
        'Some lot more cases
    End Select
    selectVisiblePanel_threadasko_rf_v(False)
    Select Case zein
        Case 0
            selectVisiblePanel_threadasko_P10Front()
        Case 1
            selectVisiblePanel_threadasko_P1Front()
        'Lots more cases
    End Select
End Sub

我首先将面板显示出来,然后用send.toBack将它们放在表单的后面,然后使面板不可见后,我将它们放回前面。

就像这样,每个selectVisiblePanel都有一个代理子程序和一个Panel#number.Visible = True。如下所示:

代码语言:javascript
复制
Delegate Sub rfCallBack()
Private Sub selectVisiblePanel_threadasko_rf()
    If Me.rf.InvokeRequired Then
        Dim d As New rfCallBack(AddressOf selectVisiblePanel_threadasko_rf)
        Me.Invoke(d, New Object() {})
    Else
        Me.rf.WindowState = FormWindowState.Maximized
    End If
End Sub
Delegate Sub rf_vCallBack(ByVal vf As Boolean)
Private Sub selectVisiblePanel_threadasko_rf_v(ByVal vf As Boolean)
    If Me.rf.InvokeRequired Then
        Dim d As New rf_vCallBack(AddressOf selectVisiblePanel_threadasko_rf_v)
        Me.Invoke(d, New Object() {vf})
    Else
        Me.rf.Visible = vf
    End If
End Sub
Delegate Sub P1CallBack()
Private Sub selectVisiblePanel_threadasko_P1()
    If Me.Panel1.InvokeRequired Then
        Dim d As New P1CallBack(AddressOf selectVisiblePanel_threadasko_P1)
        Me.Invoke(d, New Object() {})
    Else
        Me.Panel1.Visible = True
        Me.Panel1.SendToBack()
    End If
End Sub
Delegate Sub RD1CallBack()
Private Sub selectVisiblePanel_threadasko_Rd1()
    If Me.RadDock1.InvokeRequired Then
        Dim d As New P1CallBack(AddressOf selectVisiblePanel_threadasko_Rd1)
        Me.Invoke(d, New Object() {})
    Else
        Me.RadDock1.Visible = True
    End If
End Sub

我希望在我使用的新表单中使.gif在PictureBox中可见,但是在创建主表单时我只看到它。当我单击RadribbonBar中的任一按钮时,我只看到面板,但没有看到PictureBox。

我让它在一个用于快速调试的简单应用程序中使用更简单的代码。

如果有人能帮我我会很高兴的。

我得到了什么

我想要什么

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 16:42:02

我找到了我的问题的答案。我用面板打开了新表格。每个小组都有4-5个新的表格。我想用带有gif的pictureBox显示我的面板,而后台面板中的其他表单正在加载。

在WinForms中,您不能使用backgroundWorker在doWork部分加载表单/面板,或者在另一个线程中,主线程负责新表单。https://msdn.microsoft.com/es-es/library/system.componentmodel.backgroundworker(v=vs.110).aspx

我必须做一个解决办法,并在我的面板中加载的每一种形式中使用多线程或后台工作人员。通过这种方式,我只对面板中的每个表单显示一次图片框,而不是对面板中的所有窗体显示1。

我希望其他人能从我的麻烦中得到帮助。

工作小组的例子:

代码语言:javascript
复制
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    '''''''' Here I load my dtgas and dting that can take up to 2 min to load from DB. 
    Dim dtgas as System.Data.DataSet = loadFromDB(dataBeg, dataEnd)
    Dim dting as System.Data.DataSet = loadFromDB(dataBeg, dataEnd)
    Dim obj(1) As Object
    obj(0) = dtgas
    obj(1) = dting
    'System.Threading.Thread.Sleep(10000)
    e.Result = obj
    dtgas.Dispose()
    dting.Dispose()
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    'get the answer from the dowork with e.result
    Dim r(1) As Object
    If e.[Error] IsNot Nothing Then
        Exit Sub
    End If
    r = e.Result
    If r IsNot Nothing Then
        Showradcharviewtotals(r(0), r(1))
    End If 'Make the RadChartView Visible and then the panel with the image not visible
    RCVListA.Visible = True
    Panel11.Visible = False
End Sub

在load中或在从load调用的子或函数中:

代码语言:javascript
复制
Private Sub CalledFromLoad_MyDataLoad()
    RCVListA.Visible = False
    Panel11.Dock = DockStyle.Fill
    Panel11.Visible = True
    BackgroundWorker1.RunWorkerAsync()
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47599100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档