我有一个控件哪个模板包含通用ContentPresenter
。此ContentPresenter通常包含AccessText
(可能包括其他内容),其AccessKey应该关注整个控件。我该怎么做?
以下是针对我案例的具体但简化的示例。 (我知道它可以通过其他几种方式实现(例如UserControl
),但出于各种原因我需要这种方式)。我刚刚做了,有一些小的疏漏;关键是要表明这个想法。
想象一下,我想在TextBox
添加标题。我将它子类化为TextBoxEx
并添加两个依赖项属性Header
和HeaderTemplate
,类似于HeaderedContentControl
。 (代码很简单,省略了。)
然后我沿着这些方向我的TextBoxEx
分配一个模板:
<ControlTemplate TargetType="TextBoxEx">
<StackPanel>
<ContentPresenter Name="PART_Header"
Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}"
RecognizesAccessKey="True" />
<TextBox ... /> <!--or some other components with similar functionality-->
</StackPanel>
</ControlTemplate>
使用此控件时,我可能会执行以下操作:
<TextBoxEx Template="{StaticResource TemplateAbove}" Header="_Test">
<TextBoxEx.HeaderTemplate>
<DataTemplate>
<AccessText Text="{Binding}" FontSize="14" />
</DataTemplate>
</TextBoxEx.HeaderTemplate>
</TextBoxEx>
(当然,实际上它是通过样式完成的,并且更精细,但我尝试将其与最小代码混淆)。
现在,这一切都很好。唯一的问题是,当我按下Alt + T时,没有任何反应。 (除了强调T)。我想要的是控件获得焦点 - 这是通常的操作OnAccessKey。
典型地,这样的事情是使用Label
完成的,Target
具有ControlTemplate
属性,可以指向要聚焦的控件。但是在AccessText
级别,我不知道用户将使用哪个标头模板;它可能没有任何ContentPresenter.RecognizesAccessKey
相关的东西,而且我不想以任何方式限制它。然而,如果使用这种控制,我希望访问密钥工作。据推测,ContentPresenter
应该有所帮助,但我该如何判断它究竟要做什么,即要关注什么(子)控制呢?
或者是否有另一种更简单的方法(但仍然是在模板级别上)?
P.S。可以通过将Label
替换为<Label Name="PART_Header"
Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}"
Target="{Binding RelativeSource={RelativeSource TemplatedParent}} />
来解决此问题,如下所示:
$(this).on("change", updateage($(this)));
但我觉得这不是'正确'的做法,我仍然缺少一些基本的东西,所以我很乐意听取任何建议。