簡體   English   中英

如何使用 C++/WinRT 在 WinUI3 中獲取對象的父對象?

[英]How to get the parent of an object in WinUI3 with C++/WinRT?

這是 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>

因此,當我單擊按鈕時,我想獲取單擊按鈕的列表視圖項。

我怎樣才能做到這一點?

編輯:我將 xaml 示例更改為更具體的示例。

您需要使用VisualTreeHelper 類來遍歷可視化樹。 這是一個 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# 的對應物:

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>());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM