WPF控件中的内容对齐和定位

4
我是一位专业的Windows应用程序开发者,擅长使用VB.NET和C#语言以及Windows Forms进行开发。现在我非常兴奋地迈入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”出现在按钮的左上角位置,我不能更改该位置。按钮属性HorizontalContentAlignment和VerticalContentAlignment没有效果(我想知道为什么)。
此外,有时我想将文本定位到特定位置,比如当背景图像中的符号位于左侧直到x = 60时,我希望将其定位到x = 70。
我在按钮内嵌入一个标签来实现变通,但我认为应该有更清洁的解决方案。
希望我表达清楚了。顺便说一句,WPF很棒,这个网站也很棒,我通过这里(从谷歌搜索)解决了我的大多数问题 :)
提前感谢,
朱利安
1个回答

9
在这里发生了几件事情。您的第一个问题是为ContentPresenter设置了绝对大小(通常在WPF中,您应避免为控件设置绝对大小和绝对位置,但如果您从WinForms转变过来,这将是一个难以改变的习惯)。如果您删除该属性,则可以通过设置ContentPresenter本身的VerticalAlignment和HorizontalAlignment来正确对齐。设置按钮本身的VerticalAlignment和HorizontalAlignment无效,因为您没有在模板中使用这些属性。理想情况下,您应该像这样操作:
<ContentPresenter VerticalAlignment="{TemplateBinding VerticalAlignment}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}"/>

现在,您可以设置使用此模板的按钮的对齐方式。当然,如果您始终希望该模板居中,可以直接硬编码,而不是使用TemplateBinding。

通常,在替换模板时要记住的是,您在模板中没有明确绑定的控件属性将被WPF忽略,当它呈现您的控件时。如果您不告诉它如何处理这些属性,它就不会猜测。在您的示例中,内容属性是一个罕见的例外,您可以不需要显式绑定,因为WPF会假设您打算将其放入ContentPresenter中!但是所有其他按钮属性都将被忽略。例如,如果尝试更改模板化按钮的背景属性,则会被忽略,因为WPF不知道应该将该背景放在哪里。应该是整个控件?应该是您的网格?只有您的ContentPresenter?您必须告诉它。


谢谢,那很有帮助。我把它改成了:VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"然后就好了。 - Julian
1
@Julian:没问题。我投了一票支持你的问题,希望能帮到你! - Matt Burland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接