Получение местоположения сетки во время выполнения в codebehind

1

Я в файле 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>

Я узнал, что если я получаю доступ к местоположению из основного класса, тогда я могу получить координаты, если я получаю доступ к ним из кода управления пользователями, я не могу. Поэтому, если мне нужно, я могу сделать что-то взломанное, но лучше получить координаты внутри пользовательского элемента управления.

  • 0
    Может быть, вы поделитесь с вами xaml, или каким-либо кодом, как вы генерируете сетку и ее родителей / детей?
  • 0
    Какие координаты вы хотите здесь? Я имею в виду относительный элемент управления, из которого рассчитываются координаты, такие как экран, главное окно или любой другой элемент управления?
Показать ещё 1 комментарий
Теги:
wpf

2 ответа

1
Лучший ответ

Код в вашем usercontrol нуждается в доступе к Canvas, чтобы получить позицию GameBoard, потому что элемент Canvas в WPF использует абсолютное позиционирование.

Предполагая, что LetterCanvas будет родительским элементом GameBoard - попробуйте использовать это в коде для вашего пользовательского элемента GameBoard:

double xPosition = Canvas.GetLeft(this);
double yPosition = Canvas.GetTop(this);

ПРИМЕЧАНИЕ: необходимо вызвать метод, а не конструктор.

  • 0
    GetTop - это статический метод, он фактически используется для доступа к некоторому значению присоединенного свойства (в данном случае присоединенное свойство - TopProperty ) (то же самое для Left, Right, ...)
  • 0
    Ты уверен, что код компилируется? Сначала это говорит мне, что VisualTreeHelper нуждается в приведении. Затем он говорит, что я не могу получить доступ к методам GetTop и GetLeft из ссылки на экземпляр. Он говорит, что вместо этого нужно указать имя типа.
Показать ещё 7 комментариев
-1

используя элемент Grid где-то в вашем дизайне. Он предоставляет информацию о расположении ваших элементов управления в очень прямолинейном виде. Он работает как более умная версия динамически-размерной таблицы HTML. Вы можете извлекать свойства ActualWidth и ActualHeight любой строки или столбца - или даже всей самой сетки, если хотите.

  • 0
    Извините, но я этого не вижу. Я просматриваю класс в отладчике визуальной студии, и все настроено на 0 и NaN.
  • 0
    попробуй с Grid.ActualWidth
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню