Почему ActualWidth и ActualHeight начинаются с 0,0?

Я хочу добавить путь WPF к InkCanvas и использовать выделение для выбора пути WPF. Итак, я использую этот код.

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;    
drawCanvas.Children.RemoveAt(i);
inkCanvas.Children.Add(path);

Это результат. Мне нужно выбрать путь WPF от 0,0, потому что Actualwidth и ActualHeight начинаются с 0,0.

alt text

Как выбрать абсолютный путь WPF?

Спасибо

Изменить:

Теперь я могу выбрать его абсолютно с помощью этого кода.

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;
drawCanvas.Children.RemoveAt(i);
path.Margin = new Thickness(-getMinX(path), -getMinY(path), 0, 0);
containPath.Children.Add(path);
containPath.Width = getMaxX(path) - getMinX(path);
containPath.Height = getMaxY(path) - getMinY(path);
containPath.Margin = new Thickness(getMinX(path), getMinY(path), 0, 0);
inkCanvas.Children.Add(containPath);

person Hong Lim    schedule 05.01.2011    source источник


Ответы (2)


Вы можете использовать метод UIElement.UpdateLayout на InkCanvas для обновления FrameworkElement .ActualWidth и ActualHeight. См. Ссылку ActualWidth для получения справочной информации о том, почему это необходимо.

Изменить:

Я неправильно понял вопрос. Дело не в том, что ActualWidth и ActualHeight были равны нулю, а в том, что их значения были относительно (0, 0) на InkCanvas. Довольно хорошее решение проблемы - обернуть Path в Canvas и расположить его с помощью Margin следующим образом:

<Canvas Width="50" Height="50" Margin="200,200,0,0">
    <Line
        X1="0" Y1="0"
        X2="50" Y2="50"
        Stroke="Black"
        StrokeThickness="4" />
</Canvas>

который ведет себя как:

alt text

Недостатком этого подхода является то, что пользователь должен арканировать Canvas, который представляет собой прямоугольник, а не произвольную форму. Тем не менее, это намного лучше, чем лассировать объект и начало координат.

person Rick Sladkey    schedule 05.01.2011
comment
Я не думаю, что UpdateLayout что-нибудь сделает. - person NVM; 05.01.2011
comment
У нас недостаточно кода для проверки теории, но если UIElement.IsMeasureValid равно false, нет никакой надежды на правильность ActualWidth и ActualHeight. - person Rick Sladkey; 05.01.2011
comment
Пожалуйста, посмотрите мой ответ. В своем предыдущем комментарии я хотел сказать, что UpdateLayout ничего не будет делать для «Пути». - person NVM; 05.01.2011
comment
Спасибо, теперь я могу выбрать его совершенно. - person Hong Lim; 05.01.2011
comment
+1 - Спасибо @RickSladkey, использование UpdateLayout () на основе вашего ответа сделало ActualWidth доступным в моем проекте. Очень признателен. - person Sabuncu; 30.03.2012

Для элементов, которые могут быть определены только через контрольные точки (например, Line, Path и т. Д. В отличие от Rectangle, Ellipse и т. Д.), Когда вы добавляете его в элемент управления элементами (что, как я предполагаю, InkCanvas, поскольку он поддерживает выбор), сначала в панель на 0,0. Ширина и Height холста определяются по максимальным координатам X и Y контрольных точек. После этого элемент добавляется как дочерний элемент этого холста.

Вы также увидите, что всякий раз, когда вы видите такое поведение с элементом, элемент не будет поддерживать свойства макета, такие как горизонтальное / вертикальное выравнивание и т. Д.

Единственный способ, которым я это вижу, - это найти ActualWidth и ActualHeight вручную по координатам в пути.

Изменить: Это получено из личного опыта, а не из какой-либо документации.

person NVM    schedule 05.01.2011
comment
Теперь я могу найти ActualWidth и ActualHeight вручную. Но я не могу установить для них ActualWidth и ActualHeight, потому что они доступны только для чтения. - person Hong Lim; 05.01.2011
comment
ActualWidth и ActualHeight являются свойствами зависимости только для чтения (если память не изменяет). Вы просто не можете и не должны устанавливать его самостоятельно. - person NVM; 05.01.2011
comment
Для выбора украшений вам придется делать много ручной работы, чтобы делать то, что вы хотите. Когда вы добавляете элемент на холст с чернилами, он будет завернут в контейнер. Этот контейнер - то, что украшено декором выбора. Поскольку ваш контейнер содержит холст, начинающийся с 0,0, вы видите нечетное поле выбора. Вам необходимо создать производный контейнерный элемент, который самостоятельно позаботится о украшениях выбора. - person NVM; 05.01.2011
comment
Честно говоря, если вы только начали работать с WPF, это будет выглядеть как огромная задача, потому что вам нужно будет сделать много подклассов и придумать свои собственные производные InkCanvas и дочерние элементы и т. Д. И окончательный результат не показывает многого. для этого. : D - person NVM; 05.01.2011
comment
InkCanvas имеет две концепции выбора: элементы и штрихи. У элементов есть все проблемы, которые вы описываете. Но что, если мы преобразуем путь, который выглядит как серия отрезков линии, в штрихи? Затем мы можем позволить InkCanvas выполнять свою работу с лассо. - person Rick Sladkey; 05.01.2011
comment
То, что вы предлагаете, возможно. Проблема в том, что кроме удаления, украшение в этом случае практически бесполезно. Даже для перемещения (в отличие от изменения размера) вам понадобится настраиваемый элемент. По моему опыту, создание подклассов - единственное логическое решение того, что, по моему мнению, OP хочет делать после выбора. - person NVM; 05.01.2011