2010-05-05 34 views
14

Tôi có một Đường dẫn phải thay đổi kích thước cho vùng chứa StackPanel của nó.WPF: Làm thế nào để tự động chuyển đường dẫn đến vùng chứa của nó?

<StackPanel x:Name="TrackSurface"> 
    <Path Fill="AliceBlue" 
      Stroke="Black" StrokeThickness="1" 
      Data="{StaticResource TranslateZ}"> 
    </Path> 
</StackPanel> 

Tôi nghĩ đến việc sử dụng phép chuyển đổi được liên kết với vùng chứa nhưng không biết cách thực sự. Ai đó có thể cho tôi gợi ý?

Trả lời

19

Tôi đã thay đổi Stackpanel thành Lưới và Kéo thuộc tính của Đường dẫn thành tô.

<Grid x:Name="TrackSurface"> 
<Path Fill="AliceBlue" 
Stretch="Fill" 
     Stroke="Black" StrokeThickness="1" 
     Data="M148,28 C221,133 110.50025,119.5 110.50025,119.5 L124.50016,68.5 z"> 
</Path> 

+0

Cảm ơn Kishore. Nó không hoạt động trong trường hợp của tôi. Tôi có một Grid với một UserControl liên tiếp, Path là trong UserControl. Nó không được mở rộng chiều rộng cột. Đây là lý do tại sao tôi sử dụng một StackPanel. Tôi đã overriden OnRenderSizeChanged trong UserControl để duy trì một tỷ lệ khía cạnh của 1. Vì vậy, đường dẫn cần phải điền vào một UserControl bình phương mà kích thước là chiều rộng cột. Không chắc tôi rõ ràng. Với giải pháp của bạn, chiều rộng cột mở rộng để khớp với hộp xếp chồng ban đầu của Đường dẫn. – 742

+1

@ 742, bạn có thấy câu trả lời của tôi bên dưới không? Tại sao không chỉ sử dụng một ViewBox? (Ok, vì vậy đây là ba tuổi, nhưng ai đó chỉ bình chọn lên câu trả lời của tôi mà mang lại cho tôi trở lại đây.) – MarqueIV

+0

Chỉ cần thêm thông tin. Cách này hoạt động, nhưng bị giới hạn bởi vì bạn đang buộc đường dẫn kéo dài để lấp đầy vùng chứa của nó, điều này có thể không phải lúc nào cũng đúng. Hãy suy nghĩ về biểu tượng cho phái nữ ... một vòng tròn có cây thánh giá ở phía dưới. Nếu đường dẫn của bạn có khoảng trắng được đặt ra mà bạn muốn tâm của vòng tròn nằm ở giữa khu vực hiển thị, đường dẫn của bạn phải có tọa độ có liên quan đến vùng chứa của nó. Đặt vùng chứa (Grid) thành kích thước của khoảng cách, sau đó đặt đường dẫn trong đó. (Tiếp theo bên dưới ...) – MarqueIV

3

Đảm bảo rằng con đường của bạn nhỏ hơn StackPanel của bạn. Cách dễ nhất cho một con đường rất dễ là di chuyển dấu phẩy trong mọi số (tức là chia mọi thứ thành 10 hoặc 100 trong DịchZ), hoặc cho các đường dẫn phức tạp hơn, thêm một LayoutTransform (giảm hệ số tỷ lệ khi cần):

<StackPanel x:Name="TrackSurface"> 
    <Path Fill="AliceBlue" Stroke="Black" StrokeThickness="1" 
      Data="{StaticResource TranslateZ}"> 
      <Path.LayoutTransform> 
       <ScaleTransform ScaleX="0.1" ScaleY="0.1"/> 
      </Path.LayoutTransform> 
    </Path> 
</StackPanel> 

một số chú thích:

tôi đã có một vấn đề tương tự, với một mẫu nút có chứa một con đường. Kích thước "tự động" của nút được xác định bởi đường dẫn, vì đường dẫn có kích thước lớn nhất của nội dung mẫu.

Điều này tự nó có thể không bật ra như một vấn đề, bởi vì nếu bạn chỉ định của nút chiều cao/chiều rộng, hoặc nếu của nút Horizontal-/VerticalAlignment được thiết lập để kéo dài, tất nhiên con đường sẽ mở rộng quy mô.

Đối với các giá trị khác của Horizontal-/VerticalAlignment Tuy nhiên, kích thước nút được xác định bởi số lượng của không gian theo yêu cầu của nội dung của nó, mà trong trường hợp của tôi dẫn đến một nút với gốc kích thước của con đường.

12

Bất kỳ lý do nào khiến bạn không sử dụng Hộp ngắm cho điều này? Điều đó sẽ thu nhỏ hoặc phát triển con đường khi cần thiết. Nếu bạn không muốn nó thu nhỏ, nhưng thay vì cắt bớt, sau đó thiết lập chế độ cắt được giới hạn trong hộp giới hạn của điều khiển. (Tôi sẽ quấn đường dẫn trong một ContentPresenter cho điều đó.)

+1

Đây là phiên bản cũ nhưng vẫn là câu trả lời hay hơn. Tất cả những gì tôi phải làm là bọc 'Path' vào một 'Grid' bên trong một' ViewBox', và mọi thứ đều hoàn hảo. – moswald

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