0

これが私のXAMLです。UserControl の名前は「イベント」です

<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 です。私は何を間違っていますか?

ありがとう

4

2 に答える 2

2

定義しているテンプレートは、Thumbコントロールではなくコントロールに適用されます。そのため、 のテンプレートにはコントロールがありませEventん。rectEvent

別のクラスからコントロールを作成しているため、次のように、コントロールをのコード ビハインドでプロパティとしてEvent公開することができます。MoveThumbEvent

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

関数FindName( "controlName"、TemplatedParent)は、テンプレートが2番目のパラメーターとして適用されるコントロールを予期しているため、 nullを返しました。あなたが提供したコードから、テンプレートがコントロールにいつ適用されたかを確認できませんでした(evはデフォルトのテンプレートに使用されていました)。したがって、rect変数はnullでした。

これを試して

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

詳細については、こちらこちらをご覧ください

于 2012-06-18T13:19:08.183 に答える