У меня есть ContentDialog с ListView. Этот шаблон данных ListView's содержит Grid, а этот Grid имеет Button. Код выглядит так:
<ContentDialog x:Name = "DownloadListDialog" x:FieldModifier = "public" Grid.Column = "1">
<ListView Name = "AssetsListView" IsItemClickEnabled = "False" Grid.Row = "1" SelectionMode = "Single" MaxHeight = "500" ItemsSource = "{x:Bind _viewModel.Assets, Mode=OneWay}">
<ListView.ItemContainerStyle>
<Style TargetType = "ListViewItem">
...
...
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate x:DataType = "viewModel:AssetViewModel">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "*"/>
<ColumnDefinition Width = "Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text = "{x:Bind name}"/>
<StackPanel Orientation = "Horizontal">
<TextBlock Text = "{x:Bind lblFileSize}"/>
<TextBlock Text = "{x:Bind contentSize, Mode=OneWay}"/>
<TextBlock Text = "{x:Bind contentUrl}" Visibility = "Collapsed"/>
</StackPanel>
</StackPanel>
<Button Content = "Download" Click = "Button_Click" HorizontalAlignment = "Right" Grid.Column = "1"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentDialog>
Вот мой обработчик события Button Click:
private async void Button_Click(object sender, RoutedEventArgs e)
{
var grid = VisualTreeHelper.GetParent(sender as Button) as Grid;
...
...
}
Проблема в том, что переменная VisualTreeHelper.GetParent(sender as Button) as Grid всегда возвращает null на моем ПК. Но этот же код, когда я развертываю на своем мобильном телефоне, работает отлично (т.е. переменной grid присваивается правильное значение).
Обновлено:
Вот мое живое визуальное дерево, подтверждающее, что у кнопки есть родительская сетка.

Минимальная версия приложения: сборка 14393 Целевая версия приложения: сборка 15063 Версия для Windows: сборка 17134 (версия 1803)
Примечание. Я попытался изменить целевую версию приложения на 1803, но проблема осталась.
Правильный ответ был бы отличным. Но я также хотел бы добавить, что тот же код некоторое время назад работал нормально.
Странно - я пробовал ваш код и, похоже, работает нормально. Вы можете проверить, возвращает ли var obj = VisualTreeHelper.GetParent(sender as Button); что-нибудь?
Используйте доступные вам инструменты. Перейдите к Отладка / Windows / Live Visual Tree и проверьте его. Вот ваш список, содержащий 5 элементов, показывающий первый элемент с кнопкой как дочерний элемент сетки, как и ожидалось..
@Romasz, который возвращает null.
@jsanalytics Я проверил, что он возвращает ноль на ПК и правильное значение на мобильном телефоне.
@ravikumar, вы говорите, что проверили, что визуальное дерево одинаково в обоих случаях, одно и то же работает, а другое нет?
Также обновите свой вопрос, указав точный контекст, в котором вызывается ваш ContentDialog. Ваш Выпуск ОС, версия и сборка также должен быть уместной информацией.
@jsanalytics Я обновил свой вопрос.
Я попытался создать образец для проверки этой проблемы, но после появления диалогового окна я нажал кнопку и могу получить его родительскую сетку. Я не могу воспроизвести эту проблему со своей стороны, это помогло бы нам разобраться в этой проблеме в той же точке, если бы вы могли предоставить воспроизводимый проект. Более того, я обнаружил, что вы задали эту проблему в MSDN, пожалуйста, проверьте нить.





Как я понимаю из другого вопроса, есть несколько способов получить родительский элемент VisualTreeHelper. Может быть, на вашем мобильном телефоне или ПК в фоновом режиме загружаются разные вещи, так что местоположение, где вы можете найти объект сетки, изменилось.
Вы можете проверить этот ответ как ссылку на то, что я сказал выше: FrameworkElement.Parent и VisualtreeHelper.GetParent ведут себя по-разному
Неа. Даже свойство Parent sender as Button равно нулю.
Я вижу, что у многих людей возникают проблемы с получением правильных элементов управления из VisualTreeHelper. Я не могу проверить вашу проблему здесь, но вы пробовали использовать LogicalTreeHelper.GetParent ()? Также я нашел ресурс, который может дать вам больше информации: shrinandvyas.blogspot.com/2013/01/…
Вы хотите обходной путь или знать, почему он нулевой? Возможны обходные пути, ответы сложнее