0

这是我的 XAML。用户控件被命名为“事件”

<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”变量为空。我究竟做错了什么 ?

谢谢

4

2 回答 2

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;
于 2012-06-18T21:11:43.350 回答
1

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

尝试这个

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

更多信息可在此处此处获得

于 2012-06-18T13:19:08.183 回答