【问题标题】:how can i use a control in template?如何在模板中使用控件?
【发布时间】:2011-07-21 13:33:35
【问题描述】:
<Style x:Key="abc" TargetType="{x:Type Window}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <button x:name="btn">my button!!</button>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
...
<Window ... Style="{StaticResource styleMainWindow}">

如何使用按钮btn

不辜负您的期望,

MessageBox.Show(this.btn1.name);

在编译时发生错误。而且 btn1 也没有出现在智能感知中。

【问题讨论】:

  • 您是在尝试创建无外观控件还是 UserControl?

标签: c# wpf xaml


【解决方案1】:

试试 ControlTemplate 类的FindName 方法。

假设 this 是您的控件的上下文:

var button = (Button)this.Template.FindName("btn", this);

【讨论】:

    【解决方案2】:

    我猜是 mjk6026,您从窗口的实际成员元素中误解了 WPF 模板。

    确实,当我们命名一个不属于任何模板的 UI 元素 (x:Name) 时,我们可以在后面的代码中通过名称访问该元素。

    对于模板,您必须使用模板类型的 FindName() 方法。

    所以假设 `this' 表示您应用了样式的窗口,您可以访问按钮的方式是 (Button)this.Template.FindName("btn", this)

    如果这回答了您的问题,请告诉我...

    【讨论】:

    • 谢谢。我想到了一个新问题。 [1。直接从窗口的 xaml 代码添加的按钮“btn”。] [2.从模板添加的按钮“btn”。 (窗口应用了这个模板)] no.1 可以这样访问:debug.writeline(this.btn.name);但 2 号不能。是什么让这与众不同?
    • @mjk6026,是的,可以使用 this.btn 访问直接添加到窗口的没有模板的元素。模板是占位符工厂 UI,在运行时作为可视化树的一部分加载。虽然您可以在设计时设置模板,但它们仅在运行时生效。所以它们的符号\元素部分在运行时被解析,因此无论它们是否被命名,它们都不能作为“this”的一部分被访问。它们的名称在本地范围内是模板,而不是窗口级别。我希望这能回答你的问题。
    猜你喜欢
    • 2012-06-14
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多