2011-07-22 3 views
0

他のオブジェクトのControlTemplateにのみ存在するオブジェクトにイベントハンドラをプログラムで追加する方法はありますか。ControlTemplateのオブジェクトにイベントハンドラを追加する方法

私はSilverlight 4で動作します。私は、コントロールのColorSelectorをサードパーティのDLL(Liquid)から使いたいと思います。コンボボックスのように見えますが、実装方法が異なります。 (システムコンボボックスがなかった場合はSilverlightの旧バージョン用に作成された可能性があります)。ColorSelectorクラスはContentControlから派生し、その外観はxamlファイルで定義されたControlTemplateを使用して実装されます。

実際、それはコンボボックスのように見えるが、プログラム上、そのオブジェクトはコンボボックスから派生しないコントロールです。そして、私は画面上で見ることができるコンボボックスオブジェクトにプログラム的にアクセスしたいので、今私は立ち往生しています。通常、それが実際の標準ComboBoxの場合、DropDownOpenedイベントとDropDownClosedイベントを使用して、ボックスがいつ表示され、非表示になっているかを知ることができます。しかし、このカラーセレクタはこれらのイベントを提供しません。しかし、ColorSelectorの外観をDropDownオブジェクトとして定義するControlTempleteを使用します。そのDropDownクラスは、同じdllの別のクラスであり、その外観もControlTemplateによって定義されています。それは、その不思議なコンボボックスのような外観が基づいています。そして、私は今これで全然混乱しています。

画面に表示されているがコードに直接表示されていないこれらのビジュアルコントロールに、プログラムでどのようにアクセスできますか?ここでは簡単な一例である:

class ColorSelector : LiquidControl 
class LiquidControl : ContentControl 

<Style TargetType="local:ColorSelector"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:ColorSelector"> 
       <local:DropDown x:Name="RootElement"> 
       ..... 
       </local:DropDown> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

class DropDown : LiquidControl 

<Style TargetType="local:DropDown"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:DropDown"> 
       <Grid x:Name="RootElement"> 
        <Button x:Name="ElementButton"> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

今私は(new ColorControl())私のコードで新しいColorControlを作成してから、私はドロップダウンのテンプレートで定義され、そのボタンにアクセスしたいと思います。どうやってするの?

+0

Blendを使ってテンプレートを抽出しようとしましたか? – NestorArturo

+0

何を意味するのか分かりません。 (私は完全なソースコードを持っていることに注意してください)テンプレートで定義されたビジュアルコントロールへのプログラム的なアクセスはどうすればこのことができますか? –

答えて

0

元のDLLを変更したときの問題を解決しました。それはanivasによって与えられた答えに基づいています。私はDropDown.OnApplyTemplateにこのコードを置く:コンボボックスには、それぞれ開閉時

 ElementPopup.Opened += (s, ea) => { DropDownOpened(this, ea); }; 
     ElementPopup.Closed += (s, ea) => { DropDownClosed(this, ea); }; 

これら2つのイベントが合図します。 (コンボボックスが開かれたコンボボックスを表示するポップアップオブジェクトがある、私が前に理解していなかったこれらのテンプレートを使用して実装されます。)

はその後、類推、私はColorSelector.OnApplyTemplateのようなコードを追加しました:私は今

 _dropDown.DropDownOpened += (s, ea) => { DropDownOpened(this, ea); }; 
     _dropDown.DropDownClosed += (s, ea) => { DropDownClosed(this, ea); }; 

この2つの新しいイベントをColorSelectorで取得しました。このイベントは、開いたり閉じたりしたときに通知されます。それが私の望むものです。

アニバーサリーに感謝します!彼の答えはそれ自体は機能しませんでしたが、どこから始めるのかが分かりました。 (もし私がColorSelectorクラスを派生させてしまった場合は、テンプレートとルーテッドイベントを失ってしまい、DropDownも使い分けてしまいます。)

1

私はあなたがコントロールのソースコードを持っていないと思います。これを試してください:ColorSelectorOnApplyTemplateに変更して、GetTemplateChildに電話をかけてボタンを取得してください。

public override void OnApplyTemplate() 
{ 
    var button = this.GetTemplateChild("ElementButton") as Button; 
    .... Do whatever with button 
    base.OnApplyTemplate(); 
} 
+0

問題は、 'class MyColorSelector:ColorSelector'を作成しても全く動作しないことです。それは見えなくなります。 ColorSelectorの代わりにMyColorSelectorが使用されている場所は描画されません。もう一度、私はこの行動によって完全に混乱しています。 –