2011-11-19 395 views
1

我正在WPF中構建一個應用程序。它由一個複雜的背景(包含3000個矩形的畫布)和五個按鈕組成。唯一的「Focusable」和「HitVisible」元素是五個按鈕。我遇到了一個問題,如果我使用標籤定位並關注最後一個元素,那麼按下標籤和重新聚焦第一個元素之間會存在很大的延遲。有什麼我可以做,而不必刪除我的背景?鍵盤焦點滯後

for (int i = 0; i < max; ++i) 
{ 
    Rectangle rectangle = new Rectangle(); 

    rectangle.Width = 60; 
    rectangle.Height = 60; 
    rectangle.Fill = new SolidColorBrush (Color.FromArgb 
     ((byte) random.Next (0, 12), 255, 255, 255)); 

    Canvas.SetLeft (rectangle, x * 30 - 5); 
    Canvas.SetTop (rectangle, y * 30 - 5); 

    uiCanvasBackground.Children.Add (rectangle); 
} 
+0

請出示了一些示例代碼如何生成的3000個矩形不應該得到的焦點之一。 – Fischermaen

+0

問題已使用代碼編輯。 – Dave

回答

0

我會創建更多的輕量級對象,如System.Windows.Media.DrawingVisual對象,並在繪圖上下文中繪製矩形。這些將被託管在充當ItemsControl的Framework元素中。

這篇大文章介紹瞭如何實現高效的ItemsControl: Writing More Efficient ItemsControls

0

我添加了兩行代碼,我希望能夠解決你的問題:

for (int i = 0; i < max; ++i) 
{ 
    Rectangle rectangle = new Rectangle(); 

    rectangle.Width = 60; 
    rectangle.Height = 60; 

    // I added the following two lines 
    rectangle.Focusable = false; 
    rectangle.SetValue(KeyboardNavigation.IsTabStopProperty, false); 
    rectangle.Fill = new SolidColorBrush(Color.FromArgb((byte)random.Next(0, 12), 255, 255, 255)); 

    Canvas.SetLeft(rectangle, x * 30 - 5); 
    Canvas.SetTop(rectangle, y * 30 - 5); 

    uiCanvasBackground.Children.Add(rectangle); 
} 
+0

不,它不幸。爲隱藏的作品設置可見性,這很奇怪。希望我能找到另一種選擇。 – Dave

+0

你說過,你在一個表單上有3000個控件。這很重要,不是嗎?因此,當KeyboardNavigation Handler必須搜索下一個有效的控件才能獲得焦點時,需要很長時間。也許你可以在LostFocus事件中做一個解決方法,或者 - 可能更好 - 在可聚焦控件的keydown事件中,將焦點直接設置爲按下Tab鍵上的下一個有效控件,並將事件設置爲已處理。 – Fischermaen

0

如果涉及到互聯然後嘗試設置畫布上附着KeyboardNavigation.TabNavigation到無,因此框架在評估製表位時將跳過Canvas及其後代。

+0

那麼這對你有用嗎? – AndrewS