2012-01-04 73 views
8

Tôi có một Canvas có 2 "chấm" được vẽ trên đó. Xem mã này (đã được đơn giản hóa):Ràng buộc với tọa độ X Y của phần tử trên Vải WPF

<Canvas> 
    <Ellipse /> 
    <Ellipse /> 
    <Canvas.RenderTransform> 
     <RotateTransform x:Name="rotateEllipse" /> 
    </Canvas.RenderTransform> 
</Canvas> 

Như bạn có thể thấy, tôi muốn xoay khung bằng cách sử dụng RotateTransform đã cho.

Tiếp theo, tôi muốn đặt một TextBlock gần với mỗi Ellipse (một nhãn). Tuy nhiên, tôi không muốn đưa TextBlock này vào Canvas vì nó sẽ xoay vòng. Tôi muốn văn bản vẫn nằm ngang.

Bất kỳ ý tưởng nào để giải quyết vấn đề này một cách thanh lịch?

Trả lời

3

Something như thế này, nên công việc cho bạn

<TextBlock RenderTransform="{Binding RelativeSource={RelativeSource AncestorType=Canvas}, 
                 Path=RenderTransform.Inverse}"/> 

Gán cho hộp văn bản transformation matrix một ngược của ma trận biến đổi của Canvas.

+0

Điều này về cơ bản là những gì tôi đã làm. – mydogisbox

0

Câu hỏi hay! Và tôi sẽ đoán, vì vậy hãy lấy câu trả lời này với một chút muối.

Tôi tin rằng bạn đang cố gắng đặt chú thích văn bản bên cạnh dấu ba chấm trên canvas được xoay, nhưng các chú thích này cần phải nằm ngang. Hai điều bạn có thể thử:

  • Thứ nhất, do điểm XY mà bạn biết của mỗi elip từ Canvas.GetTop/GetLeft, bạn có thể tìm mới xoay XY vị trí của nó bằng cách áp dụng RotateTransform đến vị trí hình elip, sử dụng công thức U = M * V, trong đó U là điểm đầu ra, V là điểm đầu vào (vị trí XY của hình elip) và M là ma trận xoay.

  • Thứ hai, bạn có thể đặt canvas thứ hai lên trên đầu tiên (giả sử chúng nằm trong lưới, canvas thứ hai có chỉ số Z cao hơn và có cùng kích thước với canvas bên dưới). Gọi nó là một lớp chú thích. Chú thích của bạn (nhãn văn bản) có thể xuất hiện tại vị trí được chuyển đổi mới và không được bảo vệ bằng cách sử dụng phương pháp này.

Bạn sẽ phải làm điều này trong mã tất nhiên, không XAML, mặc dù bạn có thể tìm một cách tiếp cận thân thiện với ràng buộc bằng cách tạo ra một chuyển đổi giá trị trên TextBlock mà ràng buộc với nguồn RotateTransform/Ellipse và đã làm hoạt động này cho bạn.

Một cách tiếp cận khác là thực hiện .Inverse của RotateTransform và áp dụng điều đó cho textblocks, tuy nhiên bạn vẫn có thể cần dịch để đến vị trí mới. Dù bằng cách nào tôi nghĩ rằng nó đòi hỏi một số thử nghiệm.

Trân trọng,

Các vấn đề liên quan