2017-05-25 103 views
0

如果我有一個窗口的UI來自控件模板,則顯示鍵盤焦點的虛線(「焦點視覺」)不顯示。如果我使用直接內容而不是控件模板來實現,那麼焦點視覺效果很好。沒有顯示帶控制模板窗口的焦點虛線

任何人都知道如何使用控件模板時有焦點視覺?

我最初使用XAML,但爲了排除它,我在C#中做了演示代碼。我也很滿意基於XAML的解決方案。

enter image description here

的Class1.cs

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

class Class1 : Window 
{ 
    public Class1() 
    { 
     Title = "Class1"; 
     Height = 150; 
     Width = 300; 

     Template = new ControlTemplate() { 
      VisualTree = new FrameworkElementFactory(typeof(Template1)) 
     }; 
    } 

    class Template1 : StackPanel 
    { 
     public Template1() 
     { 
      Background = Brushes.White; 
      Children.Add(new TextBox()); 
      Children.Add(new Button() { Content = "button 1" }); 
      Children.Add(new Button() { Content = "button 2" }); 
     } 
    } 
} 

Class2.cs

using System.Windows; 
using System.Windows.Controls; 
class Class2 : Window 
{ 
    public Class2() 
    { 
     Title = "Class2"; 
     Height = 150; 
     Width = 300; 

     Content = new StackPanel 
     { 
      Children = 
      { 
       new TextBox(), 
       new Button() { Content = "button 1" }, 
       new Button() { Content = "button 2" }, 
      } 
     }; 
    } 
} 

MainWindow.cs

我剛剛推出的自定義窗口從主窗口...

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     (new Class1()).Show(); 
     (new Class2()).Show(); 
    } 
} 

回答

2

我認爲這個問題造成的,因爲存在Class1窗口的可視樹沒有裝飾器層,但有在Class2窗口的可視樹。

previous visual tree

當一個框架元素獲得鍵盤焦點,似乎它試圖通過裝飾器層分配對焦的視覺風格。 (參考:用於FrameworkElement的源代碼,並KeyboardNavigation

選項#1簡單的解決辦法是改變你的代碼,在代碼中加入一個ContentControl(並重新模板吧):

public Class1() 
{ 
    Title = "Class1"; 
    Height = 150; 
    Width = 300; 

    Content = new ContentControl 
    { 
     Template = new ControlTemplate() 
     { 
      VisualTree = new FrameworkElementFactory(typeof(Template1)) 
     } 
    }; 
} 

而新的視覺樹具有裝飾器層,因此焦點視覺樣式:

new visual treevisual style

選項#2或者,另一個解決辦法是,以確保您的模板具有AdornerDecorator - more details here

class Template1 : Grid 
{ 
    public Template1() 
    { 
     Background = Brushes.White; 
     Children.Add(
      new AdornerDecorator() 
      { 
       Child = new StackPanel 
       { 
        Children = 
        { 
         new TextBox(), 
         new Button() { Content = "button 1" }, 
         new Button() { Content = "button 2" }, 
        } 
       } 
      } 
     ); 
    } 
} 

注:我不知道是什麼原因裝飾器默認情況下,當你重新加入模板a ContentControl,而它不適用於Window的情況。 更新05/25:剛纔意識到,我們在使用ContentControl的自定義模板時看到的裝飾從Window的默認模板。

選項#3如果你在XAML做,只是包裝您的元素在<AdornerDecorator>

<ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
    <AdornerDecorator> 
     <StackPanel> 
      <TextBox/> 
      <Button Content="Button 1"/> 
      <Button Content="Button 2"/> 
     </StackPanel> 
    </AdornerDecorator> 
</ControlTemplate> 
+1

大答案沙拉達普拉,你明白了吧! –

+1

謝謝!我想知道AdornerDecorator的用途。 – Vimes