Dav*_*vid 1 wpf xaml focus controltemplate
我有一个textBox需要在某些情况下"转换"为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>
Run Code Online (Sandbox Code Playgroud)
然后:
<ControlTemplate x:Key="DateTextBoxTemplate" TargetType="TextBox">
<DatePicker x:Name="DateContent"
Text="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Text, Mode=TwoWay}" />
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
问题是:当我点击它时,焦点不会"转移"到日期选择器.
即:如果我点击控件,则datePicker不会获得焦点.为了实现这一点,我必须再次点击它.
我知道我可以在我的代码背后做:
protected override void OnGotFocus(RoutedEventArgs e)
{
base.OnGotFocus(e);
if (IsDate)
{
DatePicker dateContent = Template.FindName("DateContent", this) as DatePicker;
if (dateContent != null) dateContent.Focus();
}
}
Run Code Online (Sandbox Code Playgroud)
但这并不能让我满意,因为我很确定有一种方法可以在xaml中完成所有操作而我只是不知道它.
我发现另一个问题提到了这个FocusManager.FocusedElement="{Binding ElementName=DateContent}"选项,但我不知道我可以把这段代码放在哪里:它不能添加到controlTemplate(我怀疑),如果我把它放在封装datePicker的网格中模板,它基本上没用.
我只能在xaml中这样做吗?如果是,怎么样?
我过去曾经使用过这款产品
<ControlTemplate x:Key="DateTextBoxTemplate" TargetType="TextBox">
<DatePicker x:Name="DateContent" Text="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Text, Mode=TwoWay}"/>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="DateContent"
Property="FocusManager.FocusedElement"
Value="{Binding ElementName=DateContent}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1979 次 |
| 最近记录: |