Нахождение относительного z-упорядочения элементов программно в UWP - PullRequest
0 голосов
/ 25 апреля 2020

В grid я добавил два FrameworkElements в одну и ту же позицию в приложении. Теперь тот, который я добавляю позже, виден пользователю. Таким образом, изменение порядка времени компиляции в XAML решает, какой элемент будет виден.

Однако я хочу определить это программно - то есть, если я отмечу их обоих видимыми, какой элемент действительно видим для пользователя? Как я могу это сделать?

Пример XAML ниже

<Page>
    <Grid x:Name="Greedy">
        <Button x:Name="B1" Content="Button1" Margin="0,440,0,0" Height="100" Width="370"Visibility="Visible"/>
        <Button x:Name="B2" Content="Button1" Margin="0,440,0,0" Height="110" Width="380"Visibility="Visible"/>
    </Grid>
</Page>

1 Ответ

0 голосов
/ 25 апреля 2020

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

private bool iSElement1OnTop(FrameworkElement element1, FrameworkElement element2) {
            IDictionary<int, FrameworkElement> element1Parent = new Dictionary<int, FrameworkElement>();

            FrameworkElement parent = element1;
            int depth = 0;
            while (VisualTreeHelper.GetParent(parent) != null) {
                FrameworkElement tempParent = (FrameworkElement)VisualTreeHelper.GetParent(parent);
                element1Parent.Add(tempParent.GetHashCode(), parent);
                parent = tempParent;
            }

            parent = element2;
            int hashCode = 0;
            while (VisualTreeHelper.GetParent(parent) != null) {
                FrameworkElement tempParent = (FrameworkElement)VisualTreeHelper.GetParent(parent);
                if (element1Parent.ContainsKey(tempParent.GetHashCode())) {
                    hashCode = tempParent.GetHashCode();
                    parent = tempParent;
                    break;
                }

                element1Parent.Add(parent.GetHashCode(), parent);
            }

            int indexEl1 = 0;
            int indexEl2 = 0;

            element1 = element1Parent[hashCode];

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) {
                FrameworkElement e = (FrameworkElement)VisualTreeHelper.GetChild(parent, i);

                if (e.GetHashCode() == element1.GetHashCode()) {
                    indexEl1 = i;
                }
                else if (e.GetHashCode() == element2.GetHashCode()) {
                    indexEl2 = i;
                }
            }

            if (indexEl1 > indexEl2) {
                return true;
            }

            return false;
        }
    }
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...