2011-12-28 7 views
0

Silverlight 4プロジェクトで使用する無意味なコントロールを作成しました。このコントロールにはボタンが含まれており、クリックイベントをキャプチャしたいと考えています。 Generic.xamlは私が、私は次のコード無意味なコントロールボタンからイベントを取得する

を追加した、私のコントロールのコンストラクタで

[TemplatePart(Name = "PART_MyClick", Type = typeof(Button))] 

そして、私のコントロールクラスに次の属性を追加することが必要であること信じて問題を調査した後

<Style TargetType="TU:MyControl"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TU:MyControl" > 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" d:DesignWidth="550" d:DesignHeight="228"> 
        <Grid Background="Silver"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="150*"/> 
          <ColumnDefinition Width="60"/> 
          <ColumnDefinition Width="150*"/> 
         </Grid.ColumnDefinitions> 
         <Border Grid.Column="0" Margin="2" BorderBrush="DarkGray" BorderThickness="3"></Border> 
         <Border Grid.Column="2" Margin="2" BorderBrush="DarkGray" BorderThickness="3"></Border> 
         <StackPanel Grid.Column="1"> 
          <Button Name="PART_MyClick" Height="32" Width="32" Margin="0,8,0,0"></Button> 
         </StackPanel> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

が含まれています

myClick変数は常にnullなので、イベントハンドラは接続されません。私が間違っているところを教えてください。これはcompletly正しいアプローチ上の任意のアドバイスもgreatfully

答えて

1

オーバーライドOnApplyTemplate方法受信されるだろう間違ったアプローチであるかのように、初心者のIMとの代わりに、コントロールのコンストラクタであり、あなたのコードを置く:

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 
    var myClick = GetTemplateChild("PART_MyClick") as Button; 
    if(myClick != null) 
    { 
     myClick.Click += (o, e) => DoThings(); 
    } 
} 

ので、コンストラクタの呼び出し中に、コントロールのビジュアルツリーがまだ構築されていません。 MSDN OnApplyTemplate

テンプレートの一部にクラス定義のイベントハンドラをアタッチします。 の例では、クラスロジックが TextBoxテンプレート部分のKeyDownイベントを処理してUI状態が更新され、コントロールに固有の他のイベント が代わりに生成されるようにすることができます。