gpt4 book ai didi

wpf - 在控件中对齐文本底部

转载 作者:行者123 更新时间:2023-12-03 13:44:19 25 4
gpt4 key购买 nike

以下代码段:

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<StackPanel Orientation="Horizontal"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<Label Content="Name:"/>
<Label Content="Itzhak Perlman" FontSize="44"/>
</StackPanel>
</Grid>
</Window>

呈现以下内容:

我可以通过什么方式设置标签的样式,以使它们的文本底部对齐?
我对TextBlocks也有同样的问题。

注意:由于我已经为这个问题苦苦挣扎了一段时间,因此请仅发布您知道该工作的某些答案。
我已经尝试过:VerticalAlignment,VerticalContentAlignment,Padding,Margin。我还有什么不知道的吗?

我读过 this帖子,但是没有讨论字体大小不同的情况。

UPDATE :问题是,即使Padding设置为0,在ContentPresenter区域内字体周围仍然有不确定的空间。此空间随字体大小而变化。
如果我能控制这个空间,我会处于更好的状况。

谢谢

最佳答案

没有仅XAML解决方案,您必须在后面使用代码。另外,即使有代码隐藏,也没有通用的解决方案,因为如果您的文本是多行怎么办?在那种情况下应该使用哪个基线?或如果模板中有多个文本元素怎么办?例如标题和内容,或者更多,那么哪个基线呢?

简而言之,最好的选择是使用上/下边距手动对齐文本。

如果您愿意假设您只有一个文本元素,则可以通过实例化具有现有文本元素所有相同属性的FormattedText对象,从而确定基线到该元素顶部的像素距离。 FormattedText对象具有double Baseline属性,该属性保存该值。请注意,您仍然必须手动输入一个边距,因为该元素可能不完全位于其容器的顶部或底部。

看到这个MSDN论坛帖子:Textbox Baseline

这是我编写的提取该值的方法。它使用反射来获取相关属性,因为它们对于任何单个基类都不通用(它们在ControlTextBlockPageTextElement以及其他可能分别定义的属性)。

public double CalculateBaseline(object textObject)
{
double r = double.NaN;
if (textObject == null) return r;

Type t = textObject.GetType();
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;

var fontSizeFI = t.GetProperty("FontSize", bindingFlags);
if (fontSizeFI == null) return r;
var fontFamilyFI = t.GetProperty("FontFamily", bindingFlags);
var fontStyleFI = t.GetProperty("FontStyle", bindingFlags);
var fontWeightFI = t.GetProperty("FontWeight", bindingFlags);
var fontStretchFI = t.GetProperty("FontStretch", bindingFlags);

var fontSize = (double)fontSizeFI.GetValue(textObject, null);
var fontFamily = (FontFamily)fontFamilyFI.GetValue(textObject, null);
var fontStyle = (FontStyle)fontStyleFI.GetValue(textObject, null);
var fontWeight = (FontWeight)fontWeightFI.GetValue(textObject, null);
var fontStretch = (FontStretch)fontStretchFI.GetValue(textObject, null);

var typeFace = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch);

var formattedText = new FormattedText(
"W",
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
typeFace,
fontSize,
Brushes.Black);

r = formattedText.Baseline;

return r;
}

编辑:Shimmy,针对您的评论,我认为您实际上没有尝试过此解决方案,因为它可以工作。这是一个例子:

这是XAML:
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="0,40,0,0"/>
</Style>
</StackPanel.Resources>
<StackPanel Orientation="Horizontal">
<TextBlock Name="tb1" Text="Lorem " FontSize="10"/>
<TextBlock Name="tbref" Text="ipsum"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Name="tb2" Text="dolor " FontSize="20"/>
<TextBlock Text="sit"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Name="tb3" Text="amet " FontSize="30"/>
<TextBlock Text="consectetuer"/>
</StackPanel>
</StackPanel>

这是实现这一目标的背后代码
double baseRef = CalculateBaseline(tbref);
double base1 = CalculateBaseline(tb1) - baseRef;
double base2 = CalculateBaseline(tb2) - baseRef;
double base3 = CalculateBaseline(tb3) - baseRef;
tb1.Margin = new Thickness(0, 40 - base1, 0, 0);
tb2.Margin = new Thickness(0, 40 - base2, 0, 0);
tb3.Margin = new Thickness(0, 40 - base3, 0, 0);

关于wpf - 在控件中对齐文本底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2035943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com