2011-07-21 38 views
1
<Style x:Key="abc" TargetType="{x:Type Window}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Window}"> 
       <button x:name="btn">my button!!</button> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
... 
<Window ... Style="{StaticResource styleMainWindow}"> 

如何使用按鈕btn如何在模板中使用控件?

來達到你的期望,

MessageBox.Show(this.btn1.name); 

在編譯時發生錯誤。並且btn1也沒有出現在intelisense中。

+0

你想創建一個無視的控制或用戶控件? –

回答

1

嘗試ControlTemplate類中的FindName方法。

假設是你控制的範圍內:

var button = (Button)this.Template.FindName("btn", this); 
+0

謝謝。我對自己的無知感到羞恥。 – mjk6026

0

我猜mjk6026,你已經從一個窗口的實際成員元素誤解WPF模板。

確實,當我們命名不屬於任何模板的UI元素(x:Name)時,我們可以在後面的代碼中通過名稱訪問該元素。

對於模板,您將不得不使用模板類型的FindName()方法。

所以假設`這意味着窗口,你已申請你的風格,你可以訪問按鈕

讓我的方式(按鈕)this.Template.FindName(‘BTN’,這一點)知道這是否回答你的問題...

+0

謝謝。我想到一個新的問題。 [1。直接從窗口的xaml代碼添加的按鈕'btn'。] [2。從模板添加的按鈕'btn'。 (window應用這個模板)] no.1可以像這樣訪問:debug.writeline(this.btn.name);但2號不能。 是什麼使這不同? – mjk6026

+0

@ mjk6026,是一個直接添加到窗口的元素,無模板可以使用this.btn訪問。模板是在運行時作爲可視化樹的一部分加載的佔位符工廠UI。雖然您可以在設計時設置模板,但它們僅在運行時纔會生效。所以它們的符號\元素部分在運行時被解析,因此它們不能作爲「this」的一部分被訪問,而不管它們是否被命名。他們的名字是在本地範圍內的模板,而不是窗口的水平。我希望能回答你的問題。 –

相關問題