2012-04-09 105 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