2011-01-05 5 views
6

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

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 путь?

Благодаря

Edit:

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

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); 

ответ

4

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

Edit:

я неправильно понял вопрос. Дело не в том, что 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

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

+0

Я не думаю, что UpdateLayout ничего не сделает. – NVM

+0

У нас недостаточно кода для проверки теории, но если 'UIElement.IsMeasureValid' является' false', нет надежды на правильность 'ActualWidth' и' ActualHeight'. –

+0

См. Мой ответ. В моем предыдущем комментарии я хотел сказать, что UpdateLayout ничего не сделает для «Пути» – NVM

0

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

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

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

Редактировать: Это результат личного опыта, а не документации.

+0

Теперь я могу найти ActualWidth и ActualHeight вручную. Но я не могу установить их в ActualWidth и ActualHeight, потому что они только для чтения. –

+0

ActualWidth и ActualHeight - свойства зависимостей readonly (если память правильная). Вы просто не можете и не должны устанавливать его самостоятельно. – NVM

+1

Для выбора украшений вам нужно будет сделать много ручного материала, чтобы делать то, что вы хотите. Когда вы добавляете элемент в inkcanvas, он будет завернут в элемент контейнера. Этот предмет контейнера - это то, что украшено селекционером. Поскольку контейнер содержит холст, начинающийся с 0,0, вы видите нечетное поле выбора. Вам нужно создать производный элемент контейнера, который сам позаботится о выборе. – NVM