如何将TextBlock置于给定位置的中心位置

Em1*_*Em1 7 c# silverlight wpf

TextBlock应居中于位置x(或方向为垂直时为y).我实施了:

TextBlock text = new TextBlock();
// Some code to define text, font, etc. here

// Turn if Orientation is vertical
if (Orientation == Orientation.Vertical) 
{
  text.RenderTransform = new RotateTransform() { Angle = 270 };
}

// Update, then ActualWidth is set correctly
text.UpdateLayout();

// Position of label centered to given position
double halfWidth = text.ActualWidth / 2;
double x1 = (Orientation == Orientation.Horizontal) ? x - halfWidth : x;
double y1 = (Orientation == Orientation.Horizontal) ? y : y + halfWidth;

Canvas.SetLeft(text, x1);
Canvas.SetTop(text, y1);

Children.Add(text); // Add to Canvas
Run Code Online (Sandbox Code Playgroud)

这实际上很好,但是没有可能做到这一点UpdateLayout.如果我删除UpdateLayout,那么我没有得到我正在寻找的位置,因为ActualWidth(当然)为零.

Rac*_*hel 4

您可以通过将Canvas.Top/Canvas.Left值绑定到 TextBlock 的ActualWidth/ActualHeight并使用Converter.

这是一个例子。我使用的是通常用于数学公式的自定义(可以在此处MathConverter找到代码),但您也可以使用普通转换器,该转换器返回所传递值的一半。

<Style TargetType="{x:Type TextBlock}">
    <Style.Triggers>
        <Trigger Property="Orientation" Value="Horizontal">
            <Setter Property="Canvas.Left" 
                    Value="{Binding RelativeSource={RelativeSource Self}, 
                    Path=ActualWidth,
                    Converter={StaticResource MathConverter}, 
                    ConverterParameter=@VALUE/2}" />
        </Trigger>
        <Trigger Property="Orientation" Value="Vertical">
            <Setter Property="Canvas.Top" 
                    Value="{Binding RelativeSource={RelativeSource Self}, 
                    Path=ActualHeight,
                    Converter={StaticResource MathConverter}, 
                    ConverterParameter=@VALUE/2}" />
        </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

编辑

只需重新阅读问题并意识到您正在尝试将 TextBlock 置于画布上特定的 x,y 坐标的中心。在这种情况下,您需要实现 aMultiConverter而不是常规的Converter,以便可以向其传递两个参数:X/Y 值和 ActualHeight/ActualWidth 值