【问题标题】:Finding Canvas within the visual tree在可视化树中查找 Canvas
【发布时间】:2014-05-28 12:06:12
【问题描述】:

我有一个 FlipView 控件,它在其数据模板中有一个滚动查看器,然后有一个带有控件的画布。我的问题是我需要访问 FlipView.SelectionChanged 事件的事件处理程序内的画布。

FlipView 的 Xaml 如下所示。

<FlipView Grid.Row="1"
   d:DataContext="{d:DesignInstance model:PageContent}"
   SelectionChanged="FlipView_SelectionChanged"
   ItemsSource="{Binding TiffPages}"
   x:Name="flBillImage">
   <FlipView.ItemTemplate>
       <DataTemplate>
          <ScrollViewer x:Name="scrollBill" 
               VerticalScrollBarVisibility="Auto" 
               HorizontalScrollBarVisibility="Auto" 
               ZoomMode="Enabled"
               DataContextChanged="scrollBill_DataContextChanged">
                   <Canvas x:Name="cvBill"
                       DataContextChanged="cvBill_DataContextChanged"
                       Loaded="cvBill_Loaded"
                       HorizontalAlignment="Left"
                       VerticalAlignment="Top"
                       FlowDirection="LeftToRight" >

                   <Image x:Name="imgBill"            
                       Loaded="imgBill_Loaded"
                       DataContextChanged="imgBill_DataContextChanged"
                       Canvas.ZIndex="0"
                       Source="{Binding BillImage}"
                       Visibility="{Binding IsFrameExtracted, Converter={StaticResource     BooleanToVisibilityConverter}}" />
               </Canvas>
           </ScrollViewer>
       </DataTemplate>
   </FlipView.ItemTemplate>
</FlipView>

解析可视化树的 C# 代码如下所示:

 public static List<Control> AllChildren(DependencyObject parent)
    {
        var _List = new List<Control>();
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var _Child = VisualTreeHelper.GetChild(parent, i);
            if (_Child is Control)
            {
                _List.Add(_Child as Control);
            }
            _List.AddRange(AllChildren(_Child));
        }
        return _List;
    }

使用如下:

var ctrls = AllChildren(flBillImage);

检查返回的列表,我可以找到 ScrollViewer,但找不到 Canvas。我还尝试将作为参数返回的滚动查看器提供给 AllChildren 函数,但我似乎仍然找不到 Canvas 控件。

我做错了吗?

【问题讨论】:

  • 嘿,它确实有效!现在我只需要找出当前正在显示的特定画布,一切都很好。谢谢!
  • 删除评论。你可以接受答案。
  • 您在哪里使用了@RobertLangdon 提出的功能?在 FlipView.SelectionChanged 事件中?

标签: c# xaml windows-store-apps windows-8.1 visualtreehelper


【解决方案1】:

很久以前我遇到过类似的问题。 This 解决方案用于在代码隐藏中访问树的子元素。非常直接。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 2012-07-07
    • 2017-03-15
    • 2019-04-09
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    相关资源
    最近更新 更多