与Label.Target类似的属性,用于自定义模板化控件

时间:2016-07-12 12:31:01

标签: wpf keyboard-shortcuts datatemplate controltemplate

我有一个控件哪个模板包含通用ContentPresenter。此ContentPresenter通常包含AccessText(可能包括其他内容),其AccessKey应该关注整个控件。我该怎么做?

以下是针对我案例的具体但简化的示例。 (我知道它可以通过其他几种方式实现(例如UserControl),但出于各种原因我需要这种方式)。我刚刚做了,有一些小的疏漏;关键是要表明这个想法。

想象一下,我想在TextBox添加标题。我将它子类化为TextBoxEx并添加两个依赖项属性HeaderHeaderTemplate,类似于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)));

但我觉得这不是'正确'的做法,我仍然缺少一些基本的东西,所以我很乐意听取任何建议。

0 个答案:

没有答案