none
UserControl 令主表單 移動 太慢的解決方法 RRS feed

  • 問題

  • HI~,是這樣的。

    我做了一個UserControl,裡面只有1個lable(label 跟 UserControl 背景是透明),加了幾個自訂屬性。

    但當放在主Form時。

    主Form的移動速度隨userControl增多時變慢了,多了4個,就慢了0.5秒。我該怎樣解決?

    2016年2月23日 上午 08:09

解答

  • 在 Windows Forms 上面要搞這種花花綠綠的特效沒那麼容易, 至少 GDI+ 你得很熟悉.  (即使強如 Telerik 這種團隊, 做出來的某些 Windows Forms Control 也會有效能問題. 也就是說 GDI+ 不是那麼容易掌控的)

    另外一種建議是, 捨棄 Windows Forms , 改採 WPF


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年2月27日 上午 06:20
    版主
  • 這篇看看:

    [VBNET] 快速呈現縮放選擇框


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 CarbonDiarox 2016年2月27日 上午 08:52
    2016年2月27日 上午 08:37

所有回覆

  • 你該不會又用了甚麼 Timer  之類的吧

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月23日 下午 01:14
    版主
  • 沒有。絕對沒有在UserControl上用timmer。

    我把控制都交給主Form 的 timmer了。

    但不論開著動。還是關了timmer,動完後再開timmer。感覺相差不遠。

    但是多了幾個Usertrol,效能(表單運動速度)影響還是能感覺出來。

    2016年2月23日 下午 01:31
  • Forms.Timer 不用多, 一個就夠你受的了

    你的程式可以先這樣測試, 建一個新的 project, 主 Form 上不要有任何的自訂程式碼, 只要加入那四個 UserControl.

    先把問題的範圍界定出來, 究竟是 UserControl 的問題, 還是主 Form 程式碼的問題.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月23日 下午 02:37
    版主
  • 這是主Form的特效

     Private _ShowOrHide As Boolean
        <[Category]("自訂屬性")>
        Public Property ShowOrHide() As Boolean
    
            Get
                Return _ShowOrHide
            End Get
    
            Set(ByVal value As Boolean)
                _ShowOrHide = value
    
                If _ShowOrHide = True Then '--------------Open
    
                    Me.Location = ClassSkin.Sc - New Point(Me.Width, 40)
                    For i = ClassSkin.Sc.Y - 40 To ClassSkin.Sc.Y - 40 - Me.Size.Height Step -1
                        Me.Location = New Point(Me.Location.X, i)
                    Next
                    Me.TopMost = True
    
                Else '----------------------------------------Close
    
                    Me.Location = ClassSkin.Sc - New Point(Me.Width, 40 - Me.Size.Height)
                    For i = ClassSkin.Sc.Y - 40 - Me.Size.Height To ClassSkin.Sc.Y - 40
                        Me.Location = New Point(Me.Location.X, i)
                    Next
    
                End If
            End Set
    
        End Property

    這是UserControl內全部東西,只有UserControl-Pbutton 跟1個lable

    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Windows.Forms
    'Imports System.Windows.Forms
    ''' <summary>
    ''' Pbutton
    ''' </summary>
    Public Class PButton
    
        Private Sub PButton_MouseEnter(sender As Object, e As EventArgs) Handles Me.MouseEnter
            MSkButtonState(sender, 1, _SpeEff)
        End Sub
        Private Sub PButton_MouseLeave(sender As Object, e As EventArgs) Handles Me.MouseLeave
            MSkButtonState(sender, 2, _SpeEff)
        End Sub
        Private Sub PButton_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    
        End Sub
    
        ''=======================自訂屬性
    
    #Region "一般自訂性質"
        <[Category]("一般自訂性質")>
        Public Property PText() As String ''_.text
            Get
                Return Label1.Text
            End Get
            Set(ByVal value As String)
                Label1.Text = value
            End Set
        End Property
        <[Category]("一般自訂性質")>
        Public Property PFont() As Font  ''_.Front
            Get
                Return Label1.Font
            End Get
            Set(ByVal value As Font)
                Label1.Font = value
            End Set
        End Property
        <[Category]("一般自訂性質")>
        Public Property PFontColor() As Color  ''_.ForeColor
            Get
                Return Label1.ForeColor
            End Get
            Set(ByVal value As Color)
                Label1.ForeColor = value
            End Set
        End Property
        <[Category]("一般自訂性質")>
        Public Property LabelHeight() As Integer  ''_.ForeColor
            Get
                Return Label1.Height
            End Get
            Set(ByVal value As Integer)
                Label1.Height = value
            End Set
        End Property
        <[Category]("一般自訂性質")>
        Public Property LabelTextAlign() As HorizontalAlignment  ''_.ForeColor
            Get
                Return Label1.TextAlign
            End Get
            Set(ByVal value As HorizontalAlignment)
                Label1.TextAlign = value
            End Set
        End Property
    #End Region
    
    #Region "特效性質"
        Private _SpeEff As Int16 = 5
        <[Category]("新+自訂性質")>
        Public Property SpecialEffect As Int16   ''_.ClassSkin.MSkButtonState(sender, ?, _SpeEff)
            Get
                Return _SpeEff
            End Get
            Set(ByVal value As Int16)
                _SpeEff = value
            End Set
    
        End Property
    #End Region
    
    #Region "新+自訂性質"
    
        Public _Link As Form
        <[Category]("新+自訂性質")>
        Public Property Link As Form  ''Link
            Get
                Return _Link
            End Get
    
            Set(ByVal value As Form)
                _Link = value
            End Set
    
        End Property
    
        Public _Pstate As PstateEnum = PstateEnum.None
        <[Category]("新+自訂性質")>
        Public Property Pstate As PstateEnum
            Get
                Return _Pstate
            End Get
            Set(value As PstateEnum)
                _Pstate = value
    
                If _Pstate = PstateEnum.Opening Then
                    Label1.BackColor = Color.DodgerBlue
                ElseIf _Pstate = PstateEnum.Hide Then
                    Label1.BackColor = Color.Gray
                ElseIf _Pstate = PstateEnum.None Then
                    Label1.BackColor = Color.Transparent
                End If
            End Set
        End Property
        Public Enum PstateEnum As Integer
            None
            Hide
            Opening
        End Enum
    #End Region
    
    #Region "特效副程式"'為了不讓Dll干擾,特分開寫
        Sub MSkButtonState(ByVal WhichObject As Object, ByVal UseForWhatSituration As Int16, Optional ByVal ZoomSize As Int16 = 5)
    
            Select Case UseForWhatSituration
                Case 1   'mouse enter
                    For i = 1 To ZoomSize
                        WhichObject.Location = WhichObject.Location - New Point(1, 1)
                        WhichObject.Size = WhichObject.Size + New Size(2, 2)
                    Next
                Case 2   'mouse Leave
                    For i = 1 To ZoomSize
                        WhichObject.Location = WhichObject.Location + New Point(1, 1)
                        WhichObject.Size = WhichObject.Size - New Size(2, 2)
                    Next
            End Select
    
        End Sub
    
        Private Sub PButton_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        End Sub
    
    #End Region
    
    
    
    
    
    
    End Class
    


    2016年2月24日 上午 09:19
  • 你隔離測試後的結果是甚麼 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月24日 上午 09:47
    版主
  • 測試後,新的Form跟原來的Form一樣的慢慢感。

    測試:

    在主Form加入特效(就是讓主Form移上移落)程式碼。

    測試→主Form移動順滑。(約0.2~0.3)

    在主Form加入1個 UserControl,

    再測試→主Form移動算上順滑,但有黏黏的感覺。(約0.4s)

    在主Form再加入9個 = 10個 UserControl,

    再測試→主Form移動像拖著一頭豬在跑的感覺(約1.2~1.6s)。

    *Form內只有特效程式碼。沒有其他東西。


    2016年2月25日 上午 09:57
  • 特效是指甚麼? 根據你的描述, 你的主 Form 在移動的時候一定會呼叫到某些程式碼的是吧 ?  如果是, 這些程式碼可能對效能有影響.

    因為如果只是放了四個 UserControl 不應該會出現這麼慘的現象. 一步步隔離, 找出效能瓶頸.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月25日 上午 11:16
    版主
  •      If _ShowOrHide = True Then '--------------Open
    
                    Me.Location = ClassSkin.Sc - New Point(Me.Width, 40)
                    For i = ClassSkin.Sc.Y - 40 To ClassSkin.Sc.Y - 40 - Me.Size.Height Step -1
                        Me.Location = New Point(Me.Location.X, i)
                    Next
                    Me.TopMost = True
    
                Else '----------------------------------------Close
    
                    Me.Location = ClassSkin.Sc - New Point(Me.Width, 40 - Me.Size.Height)
                    For i = ClassSkin.Sc.Y - 40 - Me.Size.Height To ClassSkin.Sc.Y - 40
                        Me.Location = New Point(Me.Location.X, i)
                    Next
    
                End If

    這是特效,就是當碰到主表單時,主表單Y每次-1,慢慢上移。離開時則相反,慢慢下沉。

    我也有找過其他可能出現問題的可能,例如UserControl的控件換成color.Transport時,會讓效能變慢。我也把它改成指定顏色,效能有提高但未如理想。

    我亦考慮過另外方法,因為UserControl裡是只有一個lable,能不能不要lable,直接在UserControl上繪製文字。這樣會不會相對較快?

    2016年2月26日 上午 07:37
  • 在 Windows Forms 上面要搞這種花花綠綠的特效沒那麼容易, 至少 GDI+ 你得很熟悉.  (即使強如 Telerik 這種團隊, 做出來的某些 Windows Forms Control 也會有效能問題. 也就是說 GDI+ 不是那麼容易掌控的)

    另外一種建議是, 捨棄 Windows Forms , 改採 WPF


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2016年2月27日 上午 06:20
    版主
  • 感謝你為我指明方向。

    但WPF 好像是XXX.xmal檔。

    它還是能像控件般裝入主Form?還是該看成另一個Form?

    另外,我測試過如果把UserControl當成Label,即放20個label,也是有這樣問題,所以,應該不屬於UserControl問題。感謝幫忙。


    2016年2月27日 上午 07:14
  • 這篇看看:

    [VBNET] 快速呈現縮放選擇框


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 CarbonDiarox 2016年2月27日 上午 08:52
    2016年2月27日 上午 08:37
  • 感謝你為我指明方向。

    但WPF 好像是XXX.xmal檔。

    它還是能像控件般裝入主Form?還是該看成另一個Form?



    WPF 是另外一種 Framework  (雖然它可以和 Windows Forms 互相內嵌, 但勸你不要這樣玩), Windows Forms 倚賴 GDI+, 而 WPF 則是使用 DirectX .
    由於 WPF 比較晚出生, 所以它在一些 UI 上做了很多的改進, 至於 xaml , 這只是用來作為 UI 的描述語言.
    如果你想多了解 WPF , 以下的文章是個好的開始
    使用者入門 (WPF)

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年2月27日 下午 02:37
    版主