无法从后面的代码访问ControlTemplate的内容

时间:2012-06-18 12:52:46

标签: c# wpf xaml

这是我的XAML。 UserControl名为“Event”

<UserControl.Resources>
    <Style x:Key="eventStyle" TargetType="Thumb">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Thumb}">
                    <Rectangle Name="rect" Fill="CadetBlue" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<Canvas>
   <Thumb Canvas.Left="0" Canvas.Top="0" Name="MoveThumb" Style="{StaticResource eventStyle}" Cursor="SizeAll" DragDelta="MoveThumb_DragDelta" DragStarted="MoveThumb_DragStarted" DragCompleted="MoveThumb_DragCompleted" />
</Canvas>

这是

背后的代码
var ev = new Event();
var rect = ev.Template.FindName("rect", ev) as Rectangle;

但它不起作用:“rect”变量为null。我做错了什么?

由于

2 个答案:

答案 0 :(得分:2)

您定义的模板应用于Thumb控件,而不是Event控件 - 这就是rect模板中没有Event控件的原因。

由于您是从另一个类创建Event控件,您可以做的是将MoveThumb控件公开为Event代码隐藏中的属性,如下所示:

public Thumb TheThumb
{
    get { return MoveThumb; }
}

然后您可以将代码更改为:

var ev = new Event();
var rect = ev.TheThumb.Template.FindName("rect", ev.TheThumb) as Rectangle;

更好的是,您可以将rect控件公开为属性:

public Rectangle Rect
{
    get { return MoveThumb.Template.FindName("rect", MoveThumb) as Rectangle; }
}

并像这样使用

var ev = new Event();
var rect = ev.Rect;

答案 1 :(得分:1)

它返回 null ,因为函数 FindName(“controlName”,TemplatedParent)需要将应用模板的控件作为第二个参数。从您提供的代码中,我无法看到模板何时应用于控件( ev 用于默认模板)。因此, rect 变量为空。

试试这个

var rectangle = MoveThumb.Template.FindName("rect", MoveThumb) as Rectangle;

有更多信息herehere