WPF - Получение позиции элемента управления продолжает возвращать {0; 0} - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь получить позиции элементов управления (кнопок), но он продолжает возвращать {0; 0}.Я уверен, что этому есть объяснение, но я не могу понять, почему это происходит.

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

Что я пробовал:

- var point = btnTest.TransformToAncestor(mainGrid).Transform(new Point());
- UIElement container = VisualTreeHelper.GetParent(btnTest) as UIElement;
  Point relativeLocation = btnTest.TranslatePoint(new Point(0, 0), mainGrid);

Я пробовал это с сеткой в ​​качестве родителя ис холстом.Все, что я пытаюсь, дает мне {0,0}.Когда я изменяю параметры new Point, положение меняется.Он остается таким же, как параметры.

Небольшая часть моего XAML:

    <Grid x:Name="mainGrid">
    <Grid Name="buttonGrid" Margin="105,64,98.4,97.8">
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50"/>
            <ColumnDefinition Width="50"/>
            <ColumnDefinition Width="50"/>
        </Grid.ColumnDefinitions>
        <Button x:Name="btnTest" Grid.Row="0" Grid.Column="0" Content="Button" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="26" Height="29"/>
        <Button x:Name="btnTest2" Grid.Row="1" Grid.Column="1" Content="Button" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="26" Height="29"/>
    </Grid>
</Grid>

1 Ответ

0 голосов
/ 04 июня 2018

Ваш код работает отлично, проблема заключается во времени.Элементы UI должны быть нарисованы до того, как позиция может быть восстановлена.

В приведенном ниже примере кода показано извлечение точки, выполняемое в конструкторе с результатом 0,0 и затем в загруженном событии, которое возвращает желаемый результат 84,78.

<Window x:Class="WpfApp7.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid x:Name="mainGrid">
    <Button x:Name="btnTest" Content="TileButton" HorizontalAlignment="Left" Margin="84,78,0,0" VerticalAlignment="Top" Width="109" Height="103"/>
</Grid>

 public MainWindow()
    {
        InitializeComponent();
        GetPoint();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        GetPoint();
    }

    private void GetPoint()
    {
        var point = btnTest.TransformToAncestor(mainGrid).Transform(new Point());
        UIElement container = VisualTreeHelper.GetParent(btnTest) as UIElement;
        Point relativeLocation = btnTest.TranslatePoint(new Point(0, 0), mainGrid);
        MessageBox.Show($"X = {relativeLocation.X} Y = {relativeLocation.Y}");
    }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...