2016-01-17 8 views
0

У меня есть холст. Когда я нажимаю на него, я получаю координаты мыши и вверх (добавляет ребенка) имеет контроль custum (большой палец с простым кругом). На экране логически верхний левый угол берется как ссылка при добавлении. Я хочу разместить центр большого пальца точно там, где я нажимаю (см. Рисунок. Красная звезда = Где я нажимаю).Получите размер UIElement в WinRT

enter image description here

Чтобы сделать то, что, мне нужно, чтобы получить фактическую ширину и высоту пальца, а затем вычислить точное coordonate поместить в центр большого пальца, когда пользователь нажал. Есть ли способ лучше ? В WPF я использовал этот код, но он не работает в WinRT.

//Circle in thumb 
Ellipse Bdr = this.GetTemplateChild("Forme") as Ellipse; 
DependencyObject dobj = VisualTreeHelper.GetParent(Bdr); 
Vector ParentPosition = VisualTreeHelper.GetOffset((Visual)VisualTreeHelper.GetParent(dobj)); 
Vector BdrPosition = VisualTreeHelper.GetOffset((Visual)dobj); 
return new Point((Position.X+BdrPosition.X) + Bdr.ActualWidth /2,(Position.Y+ ParentPosition.Y) + Bdr.ActualHeight/2); 

Помогите мне? Благодаря !

ответ

1

Свойства ActualHeight и ActualWidth остаются 0, пока FrameworkElement не загружен. С другой стороны, если вы указали размер Ellipse в ControlTemplate, вы можете получить его размер на OnApplyTemplate(). Вы можете использовать делегат для передачи высоты и ширины в контейнер Page. т.е.

ThumbControl

public class ThumbControl : Control 
{ 
    public IThumbSize thumbSize; 
    public ThumbControl() 
    { 
     this.DefaultStyleKey = typeof(ThumbControl); 
    } 

    protected override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     Ellipse child = this.GetTemplateChild("circle") as Ellipse; 
     if (thumbSize != null) 
      thumbSize.SizeMeasured(child.Width, child.Height); 
    } 
} 

Стиль ThumbControl в

<Style TargetType="local:ThumbControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:ThumbControl"> 
        <Ellipse x:Name="circle" 
          Fill="Blue" 
          Height="50" 
          Width="50"></Ellipse> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

IThumb интерфейс

public interface IThumbSize 
{ 
    void SizeMeasured(double width, double height); 
} 

ContainerPage.xaml

<Grid Background="Black"> 
    <Canvas x:Name="rootCanvas" 
      Background="Transparent" 
      PointerReleased="rootCanvas_PointerReleased"></Canvas> 
</Grid> 

ContainerPage.xaml.cs

public sealed partial class ContainerPage: Page, IThumbSize 
{ 
    ThumbControl thumbControl = new ThumbControl(); 
    Point touchPoint = new Point(); 
    public ContainerPage() 
    { 
     this.InitializeComponent(); 
     thumbControl.thumbSize = this; 
    } 

    private void rootCanvas_PointerReleased(object sender, PointerRoutedEventArgs e) 
    { 
     PointerPoint pt = e.GetCurrentPoint(rootCanvas); 
     touchPoint.X = pt.Position.X; 
     touchPoint.Y = pt.Position.Y; 
     if (!rootCanvas.Children.Contains(thumbControl)) 
      rootCanvas.Children.Add(thumbControl); 
     Canvas.SetLeft(thumbControl, touchPoint.X - (thumbControl.ActualWidth/2)); 
     Canvas.SetTop(thumbControl, touchPoint.Y - (thumbControl.ActualHeight/2)); 
    } 

    public void SizeMeasured(double width, double height) 
    { 
     Canvas.SetLeft(thumbControl, touchPoint.X - (width/2)); 
     Canvas.SetTop(thumbControl, touchPoint.Y - (height/2)); 
    } 
} 

Надеется, что это помогло.