У меня есть пользовательский текстовый элемент управления, который отображает его имя, когда внутри него нет текста, но по какой-то любопытной причине мне приходится дважды нажимать клавишу 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); }
}
}
}