这是一些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鼠标光标上方。
答案 0 :(得分:0)
由于TranslateTransform
,您会在右下方看到它。您将其设置为X=100, Y=100
。如果您设置Y=0
,它应该位于顶部。
但你应该考虑使用这段代码:
为什么在画布中使用TranslateTransform
?您只需将Canvas.Top
和Canvas.Left
属性添加到TextBlock
即可。仅在您想要为元素设置动画时才使用TranslateTransform
,即使这样,将其设置为(0,0)也更方便,并且仅在动画期间更改它。 / p>
你为什么要使用画布?还有更多关于网格内部的原因?您应该能够通过使用单个Grid甚至DockPanel来实现您想要的功能。 Canvas仅用于图形,应始终保留在同一位置。有更好的数据解决方案,特别是如果它应该在运行时发生变化。
如果您想在网格的背景中使用十字架,可以尝试以下方法:
<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)
在画布中添加网格并设置属性 的HorizontalAlignment =&#34;右&#34; VerticalAlignment =&#34;顶&#34;
<Canvas x:Name="newCanvas">
<Grid>
<Label Content="Hello World!"
HorizontalAlignment="Right"
VerticalAlignment="Top"
/>
</Grid>