Я в файле codebehind для usercontrol. В этом пользовательском управлении у меня есть сетка под названием GBoard. Я создаю один экземпляр этого пользовательского элемента управления в основном файле XAML, и я называю его GameBoard. Теперь я нахожусь в коде, как я сказал ранее, и хочу получить X/Y позицию GameBoard. Если я возьму маржу, все значения будут равными 0. Если я сделаю Canvas.GetTop (это), она вернется как NaN. Как захватить эти координаты? Я не думаю, что это ошибка в моем коде, так как все работает, просто я не могу захватить координаты.
Position = new Point(Canvas.GetTop(GameBoard), Canvas.GetLeft(GameBoard));
получает NaN для значений.
boardMargin = GameBoard.Margin;
boardMargin - 0,0,0,0, хотя он расположен в центре экрана.
<UserControl x:Class="UserControls.Board"
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"
xmlns:controls="clr-namespace:UserControls"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Name="GBoard">
<Grid.ColumnDefinitions>
//lots of these
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
//lots of these
</Grid.RowDefinitions>
</Grid>
</UserControl>
что пользовательский контроль. Я отредактировал огромное количество col и row defs для космоса.
<Page x:Class="GUI.SGUI"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:UserControls"
Title="SGUI" Height="1000" Width="1000">
<Canvas x:Name="LetterCanvas">
<controls:Board x:Name="GameBoard" Height="Auto" Canvas.Left="120" Canvas.Top="164" Width="Auto"/>
</Canvas>
</Page>
Я узнал, что если я получаю доступ к местоположению из основного класса, тогда я могу получить координаты, если я получаю доступ к ним из кода управления пользователями, я не могу. Поэтому, если мне нужно, я могу сделать что-то взломанное, но лучше получить координаты внутри пользовательского элемента управления.
Код в вашем usercontrol нуждается в доступе к Canvas, чтобы получить позицию GameBoard, потому что элемент Canvas в WPF использует абсолютное позиционирование.
Предполагая, что LetterCanvas будет родительским элементом GameBoard - попробуйте использовать это в коде для вашего пользовательского элемента GameBoard:
double xPosition = Canvas.GetLeft(this);
double yPosition = Canvas.GetTop(this);
ПРИМЕЧАНИЕ: необходимо вызвать метод, а не конструктор.
GetTop
- это статический метод, он фактически используется для доступа к некоторому значению присоединенного свойства (в данном случае присоединенное свойство - TopProperty
) (то же самое для Left, Right, ...)
используя элемент Grid где-то в вашем дизайне. Он предоставляет информацию о расположении ваших элементов управления в очень прямолинейном виде. Он работает как более умная версия динамически-размерной таблицы HTML. Вы можете извлекать свойства ActualWidth и ActualHeight любой строки или столбца - или даже всей самой сетки, если хотите.