Пользовательское текстовое поле WPF занимает две вкладки, чтобы добраться до текста? - PullRequest
1 голос
/ 30 июня 2011

У меня есть пользовательский текстовый элемент управления, который отображает его имя, когда внутри него нет текста, но по какой-то любопытной причине мне приходится дважды нажимать клавишу Tab, чтобы перейти от предыдущего элемента, чтобы попасть в текстовое поле элемента управления.На первой вкладке выделено поле TextBox.Я прошел все уровни файла Generic.xaml с открытым окном свойств и начал искать 'tab', но единственное, что я смог найти, - это сам TextBox, который правильно нажимает на табуляцию.Как заставить мой контроль взять только одну вкладку, чтобы попасть в

Generic.xaml:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SuperTB">
<Style TargetType="{x:Type local:SuperTextB}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:SuperTextB}">
                <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                    <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus }" x:Name="PART_input">
                    </TextBox>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

CS:

    [TemplatePart(Name="PART_input")]
public class SuperTextB : Control
{
    private TextBox PART_input;

static SuperTextB()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(SuperTextB), new FrameworkPropertyMetadata(typeof(SuperTextB)));
}

public SuperTextB()
{
    Loaded += SuperTextBLoaded;
}

void SuperTextBLoaded(object sender, RoutedEventArgs e)
{
    if (PART_input.Text == string.Empty)
    {
        PART_input.Background = convertName();
    }
}


    public override void OnApplyTemplate()
    {
        PART_input = GetTemplateChild("PART_input") as TextBox;
        if (PART_input != null)
        {
            PART_input.GotFocus += PartInputGotFocus;
            PART_input.LostFocus += PartInputLostFocus;
        }
    }

    void PartInputLostFocus(object sender, RoutedEventArgs e)
    {
        if (PART_input.Text == string.Empty)
        {
            PART_input.Background = convertName();
        }
    }

    private VisualBrush convertName()
    {
        char[] pieces = Name.ToCharArray();
        for (int x = 0; x < pieces.Length; x++)
        {
            if (pieces[x].Equals('_'))
                pieces[x] = ' ';
        }

        String toReturn = "";

        foreach (char c in pieces)
            toReturn += c.ToString();

        VisualBrush myVis = new VisualBrush();
        myVis.Stretch = Stretch.None;
        TextBlock myText = new TextBlock();
        myText.Text = toReturn;
        myText.Foreground=Brushes.Gray;
        myVis.Visual=myText;
        return myVis;
    }


    void PartInputGotFocus(object sender, RoutedEventArgs e)
    {
            PART_input.Background = Brushes.White;
    }


    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(SuperTextB));

    public string Text
    {
        get { return (String)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}

}

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

Это потому, что у вас есть TextBox в шаблоне для вашего TextBox. Это TextBox является фокусируемым, как и ваше внешнее TextBox. Установите IsFocusable на False или измените шаблон таким образом, чтобы он не включал в себя TextBox.

0 голосов
/ 28 марта 2012

Проще говоря <Setter Property="Focusable" Value="False"/> между <Style TargetType="{x:Type local:SuperTextB}"> <Setter Property="Template"> это исправит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...