2011-07-22 29 views
0

如何以編程方式將事件處理程序添加到僅存在於另一個對象的ControlTemplate中的對象?如何將事件處理程序添加到ControlTemplate中的對象

我使用Silverlight 4.我想從第三方DLL(Liquid)中使用控件ColorSelector。它看起來像組合框,但實現方式不同。 (當沒有系統組合框時,它可能是針對Silverlight的舊版本的。)ColorSelector類派生自ContentControl,其外觀是使用xaml文件中定義的ControlTemplate實現的。

事實上,它是一個看起來像組合框的控件,但編程上它的對象不是從組合框派生的。現在我卡住了,因爲我想以編程方式訪問我可以在屏幕上看到的組合框對象。通常,如果它是一個真正的標準組合框,我將使用事件DropDownOpened和DropDownClosed來分別知道該框何時顯示和隱藏。但是這個顏色選擇器不提供這些事件。但它使用ControlTemplete將ColorSelector的外觀定義爲DropDown對象。 DropDown類是來自同一個dll的另一個類,它的外觀也由它的ControlTemplate定義,這就是那個神祕的類似combobox的外觀所基於的地方。我現在完全被這個困惑了。

如何以編程方式訪問這些可在屏幕上看到但不直接出現在代碼中的視覺控件?下面是一個簡單的例子:

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); }; 

這兩個事件的信號。 (ComboBox可使用這些模板以前我不明白實施,在有彈出對象顯示打開的組合框。)

然後類推,我加入了類似代碼ColorSelector.OnApplyTemplate

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

現在我有ColorSelector中有這兩個新事件,它在打開或關閉時發出信號。這就是我想要的。

感謝anivas!他的答案本身不起作用,但它向我展示了從哪裏開始。 (如果我派生了ColorSelector類,我就失去了它的模板和路由事件,而且它使用了DropDown,它也必須以某種方式進行更改。)

1

我相信你沒有控制的源代碼。試試這個:擴展ColorSelector覆蓋OnApplyTemplate致電GetTemplateChild獲取按鈕。

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

問題是,當我創建'類MyColorSelector:ColorSelector'它根本不起作用。它變得不可見。在使用MyColorSelector而不是ColorSelector的地方不繪製任何東西。再次,我完全被這種行爲所困惑。 –

相關問題