2012-04-09 62 views
2

我是一名專業的Windows應用程序開發人員,在VB.NET和C#中使用Windows窗體,現在非常高興能夠進入WPF開發。在這裏我的第一個問題我無法通過搜索解決:模板化wpf控件中的內容對齊和定位

我寫了下面的模板,以徹底改變我的按鈕的外觀:

<ControlTemplate TargetType="{x:Type Button}" x:Key="ImageButtonTemplate"> 
     <Grid> 
      <Image Name="img" Source="/PSPlayer;component/Images/Buttons/ButtonNormal_normal.png"/> 
      <ContentPresenter Stylus.IsTapFeedbackEnabled="False" Stylus.IsTouchFeedbackEnabled="False" Stylus.IsPressAndHoldEnabled="False" Stylus.IsFlicksEnabled="False" Width="98" Height="61"/> 
     </Grid> 

     <ControlTemplate.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter TargetName="img" Property="Source" Value="/PSPlayer;component/Images/Buttons/ButtonNormal_MouseOver.png"/> 
      </Trigger> 
      <Trigger Property="IsPressed" Value="True"> 
       <Setter TargetName="img" Property="Source" Value="/PSPlayer;component/Images/Buttons/ButtonNormal_MouseDown.png"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

這裏按鈕定義:

 <Button Content="SomeText" Height="61" Margin="0,0,0,7" Name="button7" Width="98" Click="button7_Click" Template="{StaticResource ImageButtonTemplate}"/> 

問題是,文本「SomeText」出現在按鈕的左上角,我無法更改該位置。按鈕的屬性Horizo​​ntalContentAlignment和VerticalContentAlignment不顯示效果(我想知道爲什麼)。

此外,我想將文本定位到某個位置,如x = 70,當背景圖像中有一個符號位於左側時,直到x = 60。

我做了一個標籤嵌入按鈕,我可以定位,但認爲必須有一個更清潔的解決方案的walkaround。

希望我說清楚了。 WPF rulez的方式 - 以及這個網站,我的大部分問題,我解決了張貼在這裏(從谷歌推出):)提前

感謝,

朱利安

回答

6

有幾件事情是發生在這裏。你的第一個問題是你爲你的ContentPresenter設置了一個絕對大小(一般來說,在WPF中,你避免了控件的絕對大小和絕對位置,但是當你來自WinForms時,這是一個很難被破壞的習慣)。如果通過設置ContentPresenter本身的VerticalAlignment和Horizo​​ntalAlignment來刪除它,它可以正確對齊。爲什麼在按鈕上設置VerticalAlignment和Horizo​​ntalAlignment不起作用的原因是因爲您沒有在模板中的任何位置使用這些屬性。理想情況下,您可以這樣做:

<ContentPresenter VerticalAlignment="{TemplateBinding VerticalAlignment}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}"/> 

現在您可以在使用此模板的按鈕上設置對齊方式。當然,如果你總是希望這個模板居中,你可以對它進行硬編碼而不是使用TemplateBinding。

一般來說,更換模板時要記住的事情是,在您的模板中沒有顯式綁定的控件的任何屬性在呈現您的控件時將被WPF忽略。如果你不告訴它如何處理這些屬性,它不會猜測。一個罕見的例外是你的例子中的content屬性,你可以避免顯式綁定,因爲WPF會假設你打算把它放到ContentPresenter中!但所有其他按鈕屬性都將被忽略。例如,如果嘗試更改模板化按鈕的Background屬性,它將被忽略,因爲WPF不知道放置該背景的位置。它應該是整個控制嗎?它應該是你的網格?只是你的ContentPresenter?你必須告訴它。

+0

謝謝,這有幫助。我將它改爲: VerticalAlignment =「{TemplateBinding VerticalContentAlignment}」Horizo​​ntalAlignment =「{TemplateBinding Horizo​​ntalContentAlignment}」 然後它做得很好。 – Julian 2012-04-10 13:21:29

+0

似乎我需要一些聲譽來投票你的答案。 – Julian 2012-04-10 17:10:30

+1

@Julian:NP。我投了你的問題來幫助你一點點! – 2012-04-10 17:36:55