Почему этот простой LineSegment в Silverlight переходит от центра нижнего холста к верхнему левому углу?
У меня есть очень простой код, который "правильно" рисует короткую вертикальную черную линию на синем холсте 1024x768 в WPF (хорошо в Silverlight 4).
<UserControl x:Class="SimpleCanvas.MainPage"
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"
mc:Ignorable="d"
Loaded="UserControl_Loaded">
<Grid x:Name="LayoutRoot" Background="White">
<Canvas x:Name="PathCanvas" Width="1024" Height="768" Background="Blue"/>
</Grid>
</UserControl>
и вот код позади
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
var myPathFigure = new PathFigure
{
StartPoint = new Point(492, 748)
};
var line1 = new LineSegment
{
Point = new Point(492, 708)
};
myPathFigure.Segments.Add(line1);
var myPathGeometry = new PathGeometry();
myPathGeometry.Figures.Add(myPathFigure);
var myPath = new Path
{
Data = myPathGeometry,
Stretch = Stretch.Fill,
Stroke = new SolidColorBrush(Color.FromArgb(0xFF, 0x0, 0x0, 0x0)),
StrokeThickness = 10
};
PathCanvas.Children.Add(myPath);
}
Теперь, если я изменю конечную точку сегмента линии, чтобы вместо простого изменения Y от начальной точки, я также изменил X, хотя и только на один пиксель, вся линия отображается в левом верхнем углу холста., Вот пересмотренный код позади.
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
var myPathFigure = new PathFigure
{
StartPoint = new Point(492, 748)
};
var line1 = new LineSegment
{
Point = new Point(491, 708)
};
myPathFigure.Segments.Add(line1);
var myPathGeometry = new PathGeometry();
myPathGeometry.Figures.Add(myPathFigure);
var myPath = new Path
{
Data = myPathGeometry,
Stretch = Stretch.Fill,
Stroke = new SolidColorBrush(Color.FromArgb(0xFF, 0x0, 0x0, 0x0)),
StrokeThickness = 10
};
PathCanvas.Children.Add(myPath);
}
Если бы оба визуализировались в центре внизу холста, или оба в левом верхнем углу холста, я мог бы понять. Но я не понимаю, почему первый блок кода заставляет строку отображать центр внизу, а второй блок кода заставляет строку отображать вверху слева.
Обратите внимание, что я не использую Canvas.Top или Canvas.Left.
Любое понимание с благодарностью получено!
1 ответ
Проблема здесь в том, что вы создаете путь со свойством Stretch, установленным в Stretch.Fill
, Я полагаю, вы хотите оставить путь с растяжкой по умолчанию, Stretch.None
,
Причина, по которой первый кодовый блок вызывает рендеринг строки в центре холста, заключается в том, что обе точки в его отдельном LineSegment имеют одинаковую X-координату, и, следовательно, Path имеет ширину 0. Очевидно, элемент с шириной 0 нельзя растянуть по горизонтали. Silverlight может попытаться растянуть ваш путь по вертикали, так как он имеет ненулевую высоту, но кажется, что он этого не делает.
Точно так же, если вы рисуете горизонтальную линию (так что Path имеет высоту 0), Silverlight также не растягивает линию.
Во втором кодовом блоке, когда вы изменяете X-координату, даже на 1 пиксель, вы задаете для Path ненулевую ширину и высоту. Silverlight может затем растянуть его, чтобы заполнить весь холст.
Обратите внимание, что сам элемент управления Path, как контейнер для различных сегментов пути, растягивается, а не отдельные сегменты линии, которые его составляют.