如何从XAML中访问/修改作为ControlTemplate一部分创建的元素

本文关键字:ControlTemplate 一部分 创建 元素 修改 XAML 访问 | 更新日期: 2023-09-27 18:28:14

浏览了其他相关问题,但我没有看到能回答这个明确问题的内容。

(就我而言,我正在开发一个Microsoft Surface应用程序,我使用的许多类都来自该应用程序)

因此,我想在我的ScatterView中的每个ScatterViewItem上附加一个包含一些固定项目的ElementMenu,我可以这样做:

<ControlTemplate x:Key="MenuedSVITemplate" TargetType="{x:Type s:ScatterViewItem}">
  <Grid>
    <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
      <s:ElementMenu Name="Menu" HorizontalAlignment="Right" VerticalAlignment="Top" ActivationMode="AlwaysActive">
        <s:ElementMenuItem Name="MenuItemClose" Header="Close" Click="CloseItemClicked"/>
      </s:ElementMenu>
    </ContentPresenter>
  </Grid>
</ControlTemplate>

然后我可以稍后创建使用此模板的ScatterViewItems:

<ScatterViewItem Name="SomeItem" Template="{StaticResource MenuedSVITemplate"/>

但是,如果我想向模板中定义的菜单添加其他项目,该怎么办?在XAML中有什么方法可以做到这一点吗?(我知道我可以通过使用Template.FindName来获得ElementMenu,向下转换,并以编程方式添加我的菜单项,从而在代码背后完成这项工作。)

提前感谢!

如何从XAML中访问/修改作为ControlTemplate一部分创建的元素

坦率地说,我没想到这会奏效,但它确实奏效了。检查ContentPresenter在哪里:

<Window.Resources>
  <ControlTemplate x:Key="MenuedSVITemplate"
                   TargetType="{x:Type Button}">
    <Grid>
      <Menu Name="Menu"
            HorizontalAlignment="Right"
            VerticalAlignment="Top">
        <MenuItem Name="MenuItemClose"
                  Header="Close"
                  Click="CloseItemClicked" />
        <ContentPresenter Content="{TemplateBinding Content}"
                          ContentTemplate="{TemplateBinding ContentTemplate}" />
      </Menu>
    </Grid>
  </ControlTemplate>
</Window.Resources>
<Grid>
  <Button Template="{StaticResource MenuedSVITemplate}">
    <MenuItem Name="MenuItemHello"
              Header="Hello" />
  </Button>
</Grid>