【发布时间】:2021-05-09 03:29:35
【问题描述】:
使用 UWP,我有一个 ListView,其中每个项目都包含一个 Button。点击按钮打开MenuFlyout。点击其中一个弹出选项会触发 Click 事件。
在事件处理程序中,如何找到父 Button 或父 ListView 项?
这是我的 XAML 的摘录。具体来说,我想在 OnItemEdit 处理程序中找到“Note”元素。
<Page.Resources>
<ResourceDictionary>
<DataTemplate x:Key="NoteItemTemplate">
<Grid>
<Grid.ColumnDefinitions> ... </Grid.ColumnDefinitions>
<TextBox Name="Note" />
<Button>
<Image Source="..." />
<Button.Flyout>
<MenuFlyout>
<MenuFlyoutItem Text="Edit" Click="OnItemEdit" />
<MenuFlyoutItem Text="Delete" Click="OnItemDelete" />
</MenuFlyout>
</Button.Flyout>
</Button>
</Grid>
</DataTemplate>
...
<local:DetailItemSelector x:Key="DetailItemSelector"
NoteItemTemplate="{StaticResource NoteItemTemplate}"
...
/>
</ResourceDictionary>
</Page.Resources>
<ListView
x:Name = "DetailList"
ItemsSource = "{x:Bind DetailListItems}"
ItemTemplateSelector = "{StaticResource DetailItemSelector}">
</ListView>
处理程序定义为:
async void OnItemEdit(object sender, RoutedEventArgs e)
{
...
}
编辑 - 解决方法
如果没有更好的方法,这里有一个还不错的解决方法。诀窍是使用FlyoutBase.AttachedFlyout 而不是Button.Flyout。
<DataTemplate x:Key="NoteItemTemplate">
<Grid>
<Grid.ColumnDefinitions> ... </Grid.ColumnDefinitions>
<TextBox ... Name="Note" />
<Button ... Click=="onMoreClicked">
<Image Source="..." />
FlyoutBase.AttachedFlyout
<MenuFlyout>
<MenuFlyoutItem Text="Edit" Click="OnItemEdit" />
<MenuFlyoutItem ... />
</MenuFlyout>
</FlyoutBase.AttachedFlyout>
</Button>
</Grid>
</DataTemplate>
还有,后面的代码
FrameworkElement lastItemTapped = null;
public void onMoreClicked (object sender, RoutedEventArgs e)
{
Button button = sender as Button;
// find parent list item containing button
DependencyObject element = button;
while (element != null)
{
if (element is FrameworkElement && (element as FrameworkElement).Name.Equals("Item"))
break;
element = VisualTreeHelper.GetParent(element);
}
if (element != null)
lastItemTapped = element as FrameworkElement;
// show flyout menu
FlyoutBase.ShowAttachedFlyout(button);
}
public void OnItemEdit(object sender, RoutedEventArgs e)
{
if (lastItemTapped == null)
return;
...
}
【问题讨论】: