windows 如何在winui中得到父对象(calendarview)的子对象(calendardayitem)?

k4emjkb1  于 2023-01-31  发布在  Windows
关注(0)|答案(1)|浏览(113)

在UWP中,我们可以通过FindDescendants〈〉获取孩子。但是在winui中,我们不能这样做。通过使用visualhelpertree,它总是在日历视图的getchildCount()中显示零计数
我只是想知道如何获取calendarview的孩子。我也试过这个,但总是显示零个孩子,

private void FindDescendants1(DependencyObject parent, Type targetType)
        {
            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            itemchange.Text = childrenCount.ToString();
            for (int i = 0; i < childrenCount; i++)
            {
                var child =(CalendarViewDayItem) VisualTreeHelper.GetChild(parent, i);
                if (child.GetType() == targetType)
                {
                    results.Add(child);
                }
                FindDescendants1(child, targetType);
            }
        }

我创建了这个函数来获取子函数,并调用

foreach (DependencyObject displayedDay in results)
        {
            //displayedDay = (CalendarViewDayItem)displayedDay;
            CalendarViewDayItem c = displayedDay as CalendarViewDayItem;
            if (_highlightedDates.Contains(c.Date))
            {
                Console.WriteLine(c.Date.ToString());
                //highlight
                c.Background = new SolidColorBrush(Colors.Red);
            }
            itemchange.Text = c.Date.ToString();
        }

但是这个没有得到子元素,结果是这里的对象列表,它总是显示零。

42fyovps

42fyovps1#

我的第一个猜测是在加载控件之前调用FindDescendants1(),例如在构造函数中。如果CalendarViewPage中,请尝试在PageLoaded事件中调用FindDescendants1()。
但是下面的代码中还有另一个问题。

var child = (CalendarViewDayItem)VisualTreeHelper.GetChild(parent, i);

你会得到一个异常,因为你试图将每个DependencyObject强制转换为CalendarViewDayItem,通过移除强制转换,你应该得到CalendarViewItems,尽管如此,我会将FinDescendants()设置为静态的,只接收结果:

private static IEnumerable<T> FindDescendantsOfType<T>(DependencyObject parent) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(parent, i);
        
        if (child is T hit)
        {
            yield return hit;
        }

        foreach (T? grandChild in FindChildrenOfType<T>(child))
        {
            yield return grandChild;
        }
    }
}

并像这样使用它:

this.results = FindChildrenOfType<CalendarViewDayItem>(this.CalendarViewControl);

foreach (var item in this.results)
{
    // Do you work here...
}

相关问题