Có thực sự không phải là một sự khác biệt ... những gì đang xảy ra là bạn đang dùng một cái gì đó mà ám thực sự nhỏ (đường dẫn của bạn là rất nhỏ):
nhìn vào các hộp nhỏ
... và nhân rộng nó lên vô cùng lớn và nói với bố trí để làm tròn cho toàn bộ điểm ảnh gần nhất qua UseLayoutRounding
lý do tại sao kết quả là không đáng tin cậy là Path
s đang được thu nhỏ độc lập với số Canvas
vì nó không thực sự bố trí nội dung của nó. Vì vậy, khi một trong những đường dẫn của bạn trỏ vào ranh giới pixel không đồng đều (có thể xảy ra ở một số độ phân giải màn hình và không phải là pixel khác), nó làm tròn tới pixel ảo gần nhất bên trong canvas không được chia tỷ lệ và điều này được thu nhỏ từ Viewbox
và sau đó làm tròn một lần nữa cho toàn bộ điểm ảnh gần nhất (sử dụng cùng thang tỷ lệ Viewbox
được xác định bởi tỷ lệ của Canvas
) làm trầm trọng thêm lỗi làm tròn.Bạn có thể thấy điều này được minh họa một cách dễ dàng hơn nếu chúng ta tắt StackPanel.Background
(mặc định là trong suốt) thiết lập các Canvas.Background
sang xanh lá cây và quay xuống opacity trên màu sắc của đột quỵ:
bạn sẽ nhìn thấy con đường làm tròn khác với canvas
Vì vậy, bạn phải tắt UseLayoutRounding
để có dấu thập phân được thực hiện thông qua thao tác hoặc đơn giản hóa bố cục sao cho các lỗi không xảy ra.
Ví dụ, nếu bạn để cho những con đường mở rộng bản thân bằng cách loại bỏ các khung kích thước cố định không phù hợp và không cần thiết và thiết lập Path.Stretch = Uniform
bạn kết thúc với:
<StackPanel Background="Red" Width="400" UseLayoutRounding="True">
<StackPanel.Resources>
<Style TargetType="Viewbox">
<Setter Property="Height" Value="400" />
<Setter Property="Margin" Value="0,0,0,50" />
</Style>
<Style TargetType="Path">
<Setter Property="Stroke" Value="Blue" />
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stretch" Value="Uniform" />
</Style>
</StackPanel.Resources>
<Viewbox>
<Path Data="M 1,1 h 3 v 3 h -3 z" />
</Viewbox>
<Viewbox>
<Path Data="M 1,1 h 4 v 4 h -4 z" />
</Viewbox>
</StackPanel>
kết quả là:
có lẽ những gì bạn đang thực sự tìm kiếm
Tuy nhiên, nếu điều này đơn giản hơn và bạn thực sự có nhiều đường dẫn mà bạn dự định đặt bên trong Canvas
của mình, tôi khuyên bạn nên sử dụng vùng chứa thực sự có bố cục riêng, lựa chọn hiển nhiên là Grid
theo cách này bạn vẫn có thể tự mở rộng đường dẫn các Grid
giữ chúng trong khóa bước (Canvas
s sẽ không bố trí con cái của họ). Mã này sẽ như thế nào:
<StackPanel Background="Red" Width="400" UseLayoutRounding="True">
<StackPanel.Resources>
<Style TargetType="Viewbox">
<Setter Property="Height" Value="400" />
<Setter Property="Margin" Value="0,0,0,50" />
</Style>
<Style TargetType="Path">
<Setter Property="Stroke" Value="Blue" />
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stretch" Value="Uniform" />
</Style>
</StackPanel.Resources>
<Viewbox>
<Grid Width="5" Height="5">
<Path Data="M 1,1 h 3 v 3 h -3 z" />
</Grid>
</Viewbox>
<Viewbox>
<Grid Width="6" Height="6">
<Path Data="M 1,1 h 4 v 4 h -4 z" />
</Grid>
</Viewbox>
</StackPanel>
và kết quả là giống với một mà không có một container thứ
hy vọng điều này giúp -ck
tôi copy dán XAML của bạn và có vẻ như phía dưới 2 hình ảnh, nó được cho là trông giống như những hình ảnh hàng đầu? –
Bạn đã dán xaml của tôi vào một trang trong một dự án cửa hàng ứng dụng cửa sổ? Tôi có được hình ảnh hàng đầu khi tôi chạy xaml trên máy cục bộ của tôi và hình ảnh dưới cùng trên trình mô phỏng. –
Điều này có thể do tự động mở rộng quy mô. Ghi lại kích thước màn hình của màn hình chính và trình mô phỏng. Và thử nghiệm với độ phân giải của màn hình chính để xem nó có tác dụng hay không. –