Wpf 为什么我必须按tab键两次才能使用此控件模板访问textbox?

Wpf 为什么我必须按tab键两次才能使用此控件模板访问textbox?,wpf,xaml,textbox,controltemplate,keyboard-navigation,Wpf,Xaml,Textbox,Controltemplate,Keyboard Navigation,我为一个文本框创建了一个ControlTemplate,其中包含一个标签。然而,当我尝试使用Tab来导航控件时,我必须按Tab键两次才能进入文本框字段,就好像它正在关注其中的另一个元素一样。我试着弄乱标签的焦点,但这似乎不是问题。代码如下: <ControlTemplate x:Key="custTextbox" TargetType="{x:Type TextBox}"> <Canvas x:Name="customTextbox"> <B

我为一个文本框创建了一个ControlTemplate,其中包含一个标签。然而,当我尝试使用Tab来导航控件时,我必须按Tab键两次才能进入文本框字段,就好像它正在关注其中的另一个元素一样。我试着弄乱标签的焦点,但这似乎不是问题。代码如下:

<ControlTemplate x:Key="custTextbox" TargetType="{x:Type TextBox}">
    <Canvas x:Name="customTextbox">
        <Border CornerRadius="3, 0, 0 ,3"  BorderThickness="1, 1, 0, 1" 
                Height="30" x:Name="brdTextboxLabel" Width="98">
            <Border.BorderBrush>
                <LinearGradientBrush StartPoint=".5,0" EndPoint=".5,1">
                    <GradientStop Color="#3C3F48" Offset=".88"/>
                    <GradientStop Color="#9CA1A8" Offset=".96"/>
                </LinearGradientBrush>
            </Border.BorderBrush>
            <Border.Background>
                <LinearGradientBrush StartPoint=".5, 0" EndPoint=".5, 1">
                    <GradientStop Color="#414447" Offset="0"/>
                    <GradientStop Color="#4E525B" Offset=".08"/>
                </LinearGradientBrush>
            </Border.Background>
            <Canvas>
                <Rectangle Height="24" x:Name="rectangle3" Stroke="#636369" 
                           Width="1" Canvas.Left="96" Canvas.Top="2" />
                <Label Canvas.Left="0" Padding="9,6.5,0,0" Foreground="#BABBBF" 
                       FontWeight="Bold" Canvas.Top="0" FontSize="11" 
                       Content="{TemplateBinding Tag}" Height="28" 
                       x:Name="lblTextboxHeader" Width="92" />
            </Canvas>
        </Border>
        <!-- ========================================= -->
        <Border CornerRadius="0,3,3,0" BorderThickness="0,1,1,1" Canvas.Left="98" 
                Height="30" x:Name="brdTextbox" Width="348">
            <Border.BorderBrush>
                <LinearGradientBrush StartPoint=".5,0" EndPoint=".5,1">
                    <GradientStop Color="#3C3F48" Offset=".88"/>
                    <GradientStop Color="#9CA1A8" Offset=".96"/>
                </LinearGradientBrush>
            </Border.BorderBrush>
            <Border.Background>
                <LinearGradientBrush StartPoint=".5, 0" EndPoint=".5, 1">
                    <GradientStop Color="#414447" Offset="0"/>
                    <GradientStop Color="#4E525B" Offset=".08"/>
                </LinearGradientBrush>
            </Border.Background>
            <Canvas>
                <TextBox TabIndex="0" Background="Transparent" CaretBrush="#8C8CA1"
                         FontSize="16" Padding="4, 3, 0 ,0" BorderBrush="Transparent" 
                         Foreground="#D4D5DA" Canvas.Left="0" Canvas.Top="-1" 
                         Height="30" x:Name="textBox1" Width="347"/>
            </Canvas>
        </Border>
    </Canvas>
</ControlTemplate>

抱歉,如果这是一个混乱的ControlTemplate,这是我在启动wpf/xaml时做的第一个


谢谢你抽出时间

哈!在解决另一个控件上的问题时解决了此问题

问题是,基本上,每次使用模板时,我都有两个文本框

简单的地图是:

<TextBox>
    <ControlTemplate>
        <Label/>
        <Textbox/>
    </ControlTemplate>
</TextBox>


因此,我只需将我放在窗口中的控件设置为KeyboardNavigation.IsTabStop=“false”,这样它就可以通过该文本框并转到我的ControlTemplate中的文本框。

下载Snoop并对应用程序运行它。点击tab并观察它的左下角,它会告诉你什么是焦点。找出焦点后,在该元素上设置
IsTabStop
属性。我在一台商用计算机上,我不能只下载一些东西。谢谢你!当你在做的时候,找一个新的生意;)我在开玩笑,我现在正在为你检查。当这个XAML放在一个空窗口中时,文本框会聚焦在第一个选项卡上。话虽如此,XAML之外的其他东西正在获取焦点。嗯,奇怪……我还有其他控件可以获取焦点。即使是非模板文本框也可以。如果我是你,我会重新评估你的设计。外部文本框似乎没有被使用?那为什么会有呢?您是否试图创建一个类似的文本框,以便在其中输入关键字(如[wpf]),并将其呈现到标签中?基本上,我使用'Content=“{TemplateBinding Tag}”设置ControlTemplate中标签显示的内容。这可能是(阅读:可能是)一种不可靠的方式来实现我想要的。也许这作为一个用户控件会更好?404在image.buh上找不到,为我工作,尝试另一个主机:(我无法在我的工作计算机上访问imgur…不幸的是)我看到你正在尝试使用一个可重用的控件,所以用户控件或类似网格或StackPanel的东西都可以工作。您只需要有一个带有几列的网格。你没有的是一个带有标签的文本框和另一个文本框。你可以做一些事情,但这些事情可能需要研究或在另一个问题中提出。