gpt4 book ai didi

c++-winrt - 如何使用 C++/WinRT 在 WinUI3 中获取对象的父对象?

转载 作者:行者123 更新时间:2023-12-05 03:21:17 28 4
gpt4 key购买 nike

这是 xaml 的样子:

<ListView HorizontalContentAlignment="Stretch"
x:Name="listViewMessages"
Grid.Column="1"
ItemsSource="{x:Bind MessageViewModel.Messages}"
Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualHeight}"
ItemClick="listViewMessages_ItemClick">
<ListView.HeaderTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
</Grid>
</DataTemplate>
</ListView.HeaderTemplate>

<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Message">
<Grid HorizontalAlignment="{x:Bind Path=MineToHorizontalAlignment()}" Background="{x:Bind Path=MineBackgroundColor()}" CornerRadius="8" Margin="0,6,0,2" Padding="6">
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>

...
<Button Grid.Column="5" Click="Button_Click">D</Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

所以当我单击按钮时,我想获取单击按钮的 ListView 项。

我怎样才能做到这一点?

编辑:我将 xaml 示例更改为更具体的示例。

最佳答案

您需要使用 VisualTreeHelper Class遍历可视化树。这是递归遍历父级的 C++/WinRT 实用程序:

template <typename T>
T GetParent(DependencyObject obj)
{
if (!obj)
return nullptr;

auto parent = Microsoft::UI::Xaml::Media::VisualTreeHelper::GetParent(obj);
if (!parent)
return nullptr;

auto parentAs = parent.try_as<T>();
if (parentAs)
return parentAs;

return GetParent<T>(parent);
}

它是 C# 对应物的值(value):

public static T GetParent<T>(DependencyObject obj) => (T)GetParent(obj, typeof(T));
public static object GetParent(DependencyObject obj, Type type)
{
if (obj == null)
return null;

var parent = VisualTreeHelper.GetParent(obj);
if (parent == null)
return null;

if (type.IsAssignableFrom(parent.GetType()))
return parent;

return GetParent(parent, type);
}

所以你可以这样调用它:

void MainWindow::Button_Click(IInspectable const& sender, RoutedEventArgs const&)
{
auto listView = GetParent<Controls::ListView>(sender.try_as<DependencyObject>());
}

关于c++-winrt - 如何使用 C++/WinRT 在 WinUI3 中获取对象的父对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73008993/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com