2010-12-14 53 views
1

我有一個可滾動的面板和兩個控件坐在對方的頂部 - 一個可見的不是。根據某個條件激活該表單時,我可能會交換兩個控件的可見屬性。這些控件位於可滾動面板的底部。如果當我離開該表單時,我將它滾動到底部,請改變導致控件可見性交換的條件並返回到該表單,可見控件將在頁面下方減少大約200px,從而留下很大的空白。任何人都知道可能是由什麼造成的?我試着重置滾動條的位置在窗體關閉的頂部,但這只是導致一個較小的差距,有時控制移動到其他控件更高。有任何想法嗎?滾動條位置正在移動可見/不可見更改控件

+1

plz添加圖片,以便它易於理解。 – 2010-12-14 17:30:56

回答

0

沒有再現。聽起來你不僅僅在改變Visible屬性。無論何時分配Location屬性,都必須添加AutoScrollPosition來補償滾動狀態。郵政編碼,如果這沒有幫助。

+0

那真的是我唯一做的事情。如果我將代碼註釋掉以禁用一個控件的可見性並在另一個控件上啓用它,並讓它們都可見 - 它們都停留在同一個位置,並且無論我離開窗體滾動位置的位置如何都不會移動。不過,我會玩弄AutoScrollPosition,看看我能不能找到工作。此外,該位置在控件屬性中設置 - 不是以編程方式。 – novacara 2010-12-14 19:10:33

+0

我將這標記爲最佳答案,因爲它導致我走向正確的道路。每次退出表單時,我都必須將panel.AutoScrollPosition設置爲(0,0),因爲這僅在滾動時退出表單時發生。我想我以前曾嘗試過這種方式,但是在窗體上設置了AutoScrollPosition而不是面板,所以當然不起作用。仍然不知道發生了什麼,因爲如果我沒有搞清楚可見性,它可以很好地工作,但是......哦! – novacara 2010-12-14 19:51:00

1

這裏是一個重現問題的例子。如果鼠標移動到紅色標籤上,button2的可見性將更改爲true,導致滾動跳回到Button1。

public class Form123456 : Form { 

    public Form123456() { 
     Controls.Add(new UC1()); 
    } 

    public class UC1 : UserControl { 
     Button b1 = new Button { Text = "Button1" }; 
     Label lb = new Label { Text = "_", AutoSize = true, BackColor = Color.Red }; 
     Button b2 = new Button { Text = "Button2", Visible = false }; 
     Button b2b = new Button { Text = "x" }; 
     Button b3 = new Button { Text = "Button3" }; 
     public UC1() { 
      AutoScroll = true; 
      Dock = DockStyle.Fill; 
      b1.Location = new Point(0, 200); 
      b2.Location = new Point(0, 600); 
      lb.Location = new Point(70, 600); 
      b2b.Location = new Point(90, 600); 
      b3.Location = new Point(0, 800); 
      Controls.Add(b1); 
      Controls.Add(b2); 
      Controls.Add(lb); 
      Controls.Add(b2b); 
      Controls.Add(b3); 

      lb.MouseEnter += delegate { 
       b2.Visible = true; 
      }; 
      lb.MouseLeave += delegate { 
       b2.Visible = false; 
      }; 
     } 
    } 
} 

爲了解決這個問題,一個解決辦法是添加以下代碼: Why does clicking in a text box cause an AutoScroll panel to scroll back to the top?

0

您已經驗證您改變兩個控件的可見性順序:從

protected override Point ScrollToControl(Control activeControl) { 
     return this.AutoScrollPosition; 
    } 

解決方案? 將自動滾動設置爲true的容器上的滾動條將顯示並消失,這取決於控件可見區域外部的控件的位置。不可見的控件不計數。 因此,在您的情況下,如果您在任何時候都使兩個控件不可見,則滾動條將消失。當一個控件可見時,他們會回來。所以爲了確保你沒有跳轉滾動條的位置和控制位置,你應該確保在任何時候這兩個控件都是不可見的。另一種解決方案是在容器上有一個僞可見控件。這是一個控件,它的可見性設置爲true,但實際上對用戶不可見(例如背景顏色的點,沒有文本的標籤......)。將此控件放置在x,y最遠的位置並且滾動條永不消失。