【问题标题】:Content alignment and positioning in templated wpf control模板化 wpf 控件中的内容对齐和定位
【发布时间】:2012-04-22 01:21:09
【问题描述】:

我是一名专业的 VB.NET 和 C# 与 Windows 窗体的 Windows 应用程序开发人员,现在非常高兴能够涉足 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。

我在按钮内嵌入了一个标签,我可以定位但认为必须有更清洁的解决方案。

希望我说清楚了。顺便说一句,WPF rulez - 以及这个网站,我通过这里的帖子(来自谷歌)解决了我的大部分问题:)

提前致谢,

朱利安

【问题讨论】:

    标签: wpf templates location


    【解决方案1】:

    这里发生了一些事情。您的第一个问题是您为 ContentPresenter 设置了绝对大小(通常,在 WPF 中,您避免控件的绝对大小和绝对位置,但是当您来自 WinForms 时,这是一个很难改掉的习惯)。如果您删除它,它将可以通过设置 ContentPresenter 本身的 VerticalAlignment 和 Horizo​​ntalAlignment 来正确对齐。在按钮本身上设置 VerticalAlignment 和 Horizo​​ntalAlignment 不起作用的原因是您没有在模板中的任何地方使用这些属性。理想情况下,您应该这样做:

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

    现在您可以在使用此模板的按钮上设置对齐方式。当然,如果你总是希望这个模板居中,你可以硬编码而不是使用 TemplateBinding。

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

    【讨论】:

    • 谢谢,有帮助。我将其更改为: VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Horizo​​ntalAlignment="{TemplateBinding Horizo​​ntalContentAlignment}" 然后效果很好。
    • @朱利安:NP。我投票赞成你的问题来帮助你一点!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2017-08-21
    相关资源
    最近更新 更多