WPF - 在Canvas中更改文本锚点

时间:2017-10-10 13:01:16

标签: c# wpf canvas

这是一些XAML:

<Grid Width="200" Height="200">  
    <Canvas Background="Beige">
        <Line X1="0" X2="200" Y1="100" Y2="100" Stroke="Black"/>
        <Line X1="100" X2="100" Y1="0" Y2="200" Stroke="Black"/>
        <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Margin="2">
            <TextBlock.RenderTransform>
                <TranslateTransform X="100" Y="100"/>
            </TextBlock.RenderTransform>
            hello world1
            <LineBreak/>
            hello world2
            <LineBreak/>
            hello world3
        </TextBlock>
    </Canvas>
</Grid>

我希望文字显示在Canvas的右上象限中,而不是右下象限。

是否可以在WPF中进行?

目前,文字是从左到右绘制的,我希望它可以从左下角画到右上角。

我在互联网上找不到Canvas内的答案。

在我的生产代码中,文本应该可以是任何长度和高度。

修改:

我被要求提供一个完整的样本,所以这里是:

XAML:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <!--The drawing area can be anything, a grid, a panel, a canvas... Can't just use specific alignment tools so I have to use a Transform-->
        <Grid x:Name="DrawingArea" Background="Beige" MouseMove="UIElement_OnMouseMove">
            <TextBlock x:Name="TextBlock" Margin="2">
                hello world1
                <LineBreak/>
                hello world2
                <LineBreak/>
                hello world3
            </TextBlock>
        </Grid>
    </Grid>
</Window>

代码背后:

using System.Windows.Input;
using System.Windows.Media;

namespace WpfApp1
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void UIElement_OnMouseMove(object sender, MouseEventArgs e)
        {
            var mousePos = e.GetPosition(DrawingArea);
            TextBlock.RenderTransform = new TranslateTransform(mousePos.X, mousePos.Y);
        }
    }
}

目前文本显示在默认的Windows鼠标光标下方,我希望它显示在默认的Windows鼠标光标上方。

2 个答案:

答案 0 :(得分:0)

由于TranslateTransform,您会在右下方看到它。您将其设置为X=100, Y=100。如果您设置Y=0,它应该位于顶部。

但你应该考虑使用这段代码:

  1. 为什么在画布中使用TranslateTransform?您只需将Canvas.TopCanvas.Left属性添加到TextBlock即可。仅在您想要为元素设置动画时才使用TranslateTransform,即使这样,将其设置为(0,0)也更方便,并且仅在动画期间更改它。 / p>

  2. 你为什么要使用画布?还有更多关于网格内部的原因?您应该能够通过使用单个Grid甚至DockPanel来实现您想要的功能。 Canvas仅用于图形,应始终保留在同一位置。有更好的数据解决方案,特别是如果它应该在运行时发生变化。

  3. 如果您想在网格的背景中使用十字架,可以尝试以下方法:

    <Grid 
        Width="200" 
        Height="200" 
        Background="Beige">  
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Line 
            X1="0" 
            X2="200" 
            Y1="100" 
            Y2="100" 
            Stroke="Black" 
            Grid.RowSpan="2" 
            Grid.ColumnSpan="2"/>
        <Line 
            X1="100" 
            X2="100" 
            Y1="0" 
            Y2="200" 
            Stroke="Black" 
            Grid.RowSpan="2" 
            Grid.ColumnSpan="2"/>
        <TextBlock 
            VerticalAlignment="Center" 
            HorizontalAlignment="Center" Margin="2"
            Grid.Row="0"
            Grid.Column="1">
            hello world1
            <LineBreak/>
            hello world2
            <LineBreak/>
            hello world3
        </TextBlock>
    </Grid>
    

答案 1 :(得分:-2)

在画布中添加网格并设置属性 的Horizo​​ntalAlignment =&#34;右&#34; VerticalAlignment =&#34;顶&#34;

<Canvas x:Name="newCanvas">
<Grid>
    <Label Content="Hello World!"
           HorizontalAlignment="Right"
           VerticalAlignment="Top" 
    />
</Grid>