2011-11-19 194 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