Как вы измеряете размер объекта Path в WPF / Silverlight? - PullRequest
1 голос
/ 12 ноября 2011

Я работаю над системой отображения в WPF и столкнулся со странным поведением при работе с элементами Path.У нас есть элемент canvas с объектами пути, которые показывают местоположения на карте.Когда я пытаюсь измерить их размер или местоположение с помощью кода, их размер всегда включает их расстояние от источника (0,0), а их местоположение всегда находится в начале координат.Я не могу понять, как измерить фактическую видимую область самого пути.Вот пример:

Path Sample

Теперь, как вы можете видеть, путь имеет размер всего около ста пикселей, но при чтении свойств AcutalWidth / ActualHeight он включает его расстояние отверхний / левый угол тоже.Я также попробовал метод .Measure () на пути и получил тот же результат.Существуют ли какие-либо специальные инструменты для измерения видимой области путей?

Вот код этого примера для справки:

<Window x:Class="WPF_Testing_Area.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas x:Name="Wrapper" Width="2185.922" Height="3091.486">
            <Path Fill="#FF9EC99F" MouseLeftButtonDown="Path_MouseLeftButtonDown" Stroke="Black" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeLineJoin="Round" 
                    Data="F1M1501.916,677.412C1480.471,683.851 1457.263,676.647 1443.234,659.196 1441.36,656.865 1439.083,654.889 1436.51,653.362L1436.805,800.23 1533.736,819.855C1537.515,820.62,1541.335,821.166,1545.177,821.49L1501.916,677.412z"/>
        </Canvas>
    </Grid>
</Window>

И код:

using System.Windows;
using System.Windows.Input;
using System.Windows.Shapes;

namespace WPF_Testing_Area
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Path_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var path = sender as Path;
            var size = new Size(path.ActualWidth, ActualHeight);
            MessageBox.Show(size.ToString());

            // try to measure the shape
            path.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            MessageBox.Show(path.DesiredSize.ToString());
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 12 ноября 2011

Это будет довольно сложно, потому что если путь содержит дугу и дуга выходит за пределы координат / точки, которые использовались для определения пути, будет трудно вычислить ограничивающий прямоугольник.

См .: WPF: Как получить истинный размер (ограничивающий прямоугольник) фигур и Получение истинного визуального ограничивающего прямоугольника элемента WPF?

0 голосов
/ 16 ноября 2011

Думаю, это будет более хитроумно. Можете ли вы ссылаться на эти ссылки.

http://msdn.microsoft.com/en-us/library/865tf5y6%28v=vs.80%29.aspx

http://forums.silverlight.net/t/22300.aspx/1

0 голосов
/ 12 ноября 2011

Я бы попытался вычесть значение Canvas.Left пути из значения path.ActualWidth (то же самое для Canvas.Top и path.ActualHeight). Я думаю, что это даст вам правильный размер.

...