2017-10-10 77 views
0

改變文本錨點下面是一些XAML:WPF - 在畫布

<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中做?

目前文本是從全文繪製到底部,我想它是從bottomleft到topright繪製的。我在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

那麼,爲什麼你不只是減去mousePos.Y將TextBlock的的ActualHeight? – Clemens

+0

目前我知道使用代碼隱藏的文本高度,但在我的實際應用程序(基於MVVM)我無法獲得文本的高度。所以它需要以某種方式從ValueConverter或其他東西的文本中的「Transform」中減去。我不知道如何做到這一點? – ManIkWeet

+0

所以你的問題中的代碼再次沒有顯示你實際在做什麼。你期望在這裏得到什麼支持? – Clemens

回答

-2

添加一個網格,你的畫布,設置屬性 的Horizo​​ntalAlignment =「右」 VerticalAlignment =「評出的」

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

0

你看它,因爲TranslateTransform的右下部分。您將其設置爲X=100, Y=100。如果你設置Y=0它應該在頂部。

但是,你應該考慮的一些事情,此代碼:

  1. 爲什麼要用TranslateTransform畫布裏面?您可以將Canvas.TopCanvas.Left屬性添加到TextBlock,並且應該這樣做。僅當您想要動畫元素時才使用TranslateTransform,即使如此,將其設置爲(0,0)也更方便,並且僅在動畫過程中對其進行更改。

  2. 爲什麼你在使用畫布?還有更多關於爲什麼在一個網格內?你應該能夠通過使用單個Grid或者甚至是一個DockPanel來實現你想要的。畫布僅用於圖形,應始終保持在同一位置。對數據有更好的解決方案,特別是如果它在運行時應該改變的話。

如果你想在你的網格的背景交叉,你可以嘗試這樣的事:

<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> 
+0

我正在使用'Canvas'和'Translation'矩陣,因爲這就是我正在使用的(類似於CAD的情況)。使用'Canvas.Top'和'Canvas.Left'對我來說是不可能的,因爲元素不在畫布內(它們在'ContentPresenter'內部) – ManIkWeet