Как я могу получить X, Y позицию UserControl в Canvas? - PullRequest
3 голосов
/ 18 февраля 2011

У меня есть простой UserControl, реализованный, как показано ниже, - который я помещаю в Canvas. Я перемещаю его, используя Multi-touch, и хочу иметь возможность читать его новое положение X, Y, используя процедурный код C #. В идеале я хотел бы иметь X и Y как два свойства или как точку (X, Y).

<UserControl x:Class="TouchControlLibrary.myControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="64" d:DesignWidth="104">
    <Border Name="ControlBorder" BorderThickness="1" BorderBrush="Black">
        <DockPanel Margin="1" Height="60 " Width="100">
            <StackPanel  DockPanel.Dock="Left" Background="Gray"  Width="20" >
                <Button Background="#FFDEDE53" Padding="0">In</Button>
            </StackPanel>
            <StackPanel  DockPanel.Dock="Right" Background="Gray"  Width="20" >
                <Button Background="#FFE8B48F" Padding="0">Out</Button>
            </StackPanel>
        </DockPanel>  
    </Border>
</UserControl>

Я ожидал, что смогу создать присоединенное свойство для каждого из 'X' и 'Y' и заполнить их из Canvas.Left и Canvas.Top, используя привязку или некоторую форму присоединенного свойства или, возможно, что-то еще полностью.

Тем не менее, несмотря на то, что я потратил довольно много времени на поиск решения, все, что я нашел, похоже, «не совсем то, что нужно».

Что бы вы предложили мне сделать, чтобы решить эту проблему?

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Хорошо, вот пример кода, для которого я хочу получить Y, вы можете выяснить X надеюсь, что это то, что вам нужно:

Point current = e.GetPosition(MyControl as UIElement); //where your control is
Point top = e.GetPosition(Canvas as UIElement); //or maybe just the height of the canvas
Thickness margin = new Thickness();
margin.Top = top.Y - current.Y; //distance from the top
MyControl.Margin = margin;
1 голос
/ 18 февраля 2011

позвольте мне увидеть, если у меня есть это право, вы создаете новый экземпляр пользовательского элемента управления и добавляете его на холст? Затем вы перемещаете его с помощью Multi-touch (как вы это делаете? Через поведение или вручную?), И в любой момент вы хотите прочитать новую позицию X / Y экземпляра пользовательского элемента управления относительно Canvas?

Почему вы не можете просто прочитать то же самое, что меняется, когда вы перемещаете его прикосновением? Вы уже посмотрели на свойство RenderTransform, это то, что обычно изменяется, когда вы манипулируете чем-либо с помощью поведения или ручных настроек.

...