2017-05-25 24 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

私はadorner-層がClass1ウィンドウのビジュアルツリーに存在しないため、この問題が発生したと思いますが、Class2ウィンドウのビジュアルツリーにあります。

previous visual tree

フレームワーク要素がキーボードフォーカスを取得すると、adorner-層を介してフォーカスビジュアルスタイルを割り当てようと思われます。 (参考: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

そして新しいビジュアルツリーはadorner層、したがって焦点のビジュアルスタイルを持っています

オプション#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" }, 
        } 
       } 
      } 
     ); 
    } 
} 

注:私はあなたが再ときadornerがデフォルトで追加された理由を正確にわからないがテンプレートContentControlWindowの場合はテンプレートではありません。 更新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

関連する問題