У меня есть текстовое поле, которое при определенных обстоятельствах необходимо «преобразовать» в DatePicker.
легко сделать с помощью шаблона:
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="local:MyTextBox.IsDate" Value="True">
<Setter Property="Template" Value="{StaticResource DateTextBoxTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
, а затем:
<ControlTemplate x:Key="DateTextBoxTemplate" TargetType="TextBox">
<DatePicker x:Name="DateContent"
Text="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Text, Mode=TwoWay}" />
</ControlTemplate>
проблема в том, что при щелчке по нему фокус не «переносится» на средство выбора даты.
, т. Е. Если я нажимаю на элемент управления, средство выбора даты не получает фокус.Я должен щелкнуть по нему еще раз, чтобы это произошло.
Я знаю, что могу сделать в своем коде:
protected override void OnGotFocus(RoutedEventArgs e)
{
base.OnGotFocus(e);
if (IsDate)
{
DatePicker dateContent = Template.FindName("DateContent", this) as DatePicker;
if (dateContent != null) dateContent.Focus();
}
}
, но это не очень меня устраивает, так как я довольноЯ уверен, что есть способ сделать все это в xaml, и я просто не знаю об этом.
Я нашел другой вопрос, в котором упоминается опция FocusManager.FocusedElement="{Binding ElementName=DateContent}"
, но я понятия не имею, где я могу поставитьэтот кусок кода: он не может быть добавлен к controlTemplate (как я и подозревал), и если я помещу его в сетку, инкапсулирующую datePicker в шаблоне, он в основном бесполезен.только xaml?и если да, то как?