XAML 전용 솔루션이 없으므로 코드를 사용해야합니다. 또한 코드 숨김을 사용하더라도 텍스트가 여러 줄이면 무엇 때문에이 문제에 대한 일반적인 해결책은 없습니까? 어떤 기준선을 사용해야합니까? 또는 템플릿에 여러 텍스트 요소가있는 경우 어떻게해야합니까? 헤더와 내용, 또는 그 이후의 기준선은?
요약하면 가장 좋은 방법은 위쪽/아래쪽 여백을 사용하여 수동으로 텍스트를 정렬하는 것입니다.
텍스트 요소가 하나만 있다고 가정하고 싶다면 FormattedText
개체를 기존 요소의 모든 속성으로 인스턴스화하여 요소 위쪽에서 기준선까지의 픽셀 거리를 계산할 수 있습니다 텍스트 요소. FormattedText
개체에는 해당 값을 보유하는 double
Baseline
속성이 있습니다. 요소가 컨테이너의 상단 또는 하단에 정확히 위치하지 않을 수 있으므로 여백을 수동으로 입력해야합니다. Textbox Baseline
여기에 그 값을 추출 내가 쓴 방법이있다 :
이 MSDN 포럼 게시물을 참조하십시오. 단일 기본 클래스에 공통적이지 않기 때문에 리플렉션을 사용합니다 (이들은
Control
,
TextBlock
,
Page
,
TextElement
및 기타로 별도로 정의됩니다).
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;
}
EDIT : 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);
아하! 업데이트로 문제가 명확 해집니다. –