Нахождение холста в визуальном дереве
У меня есть элемент управления FlipView, который в своем шаблоне данных получил scrollviewer, который затем получил холст с элементами управления. Моя проблема в том, что мне нужно получить доступ к холсту внутри обработчика событий для события FlipView.SelectionChanged.
Xaml для FlipView выглядит следующим образом.
<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. Я также пытался предоставить scrollviewer, возвращенный в качестве аргумента функции AllChildren, но я все еще не могу найти элемент управления Canvas.
Я делаю все это неправильно?
1 ответ
Я столкнулся с подобной проблемой довольно давно. Это решение использовалось для доступа к дочерним элементам дерева в коде. Многое прямо вперед.
Надеюсь, это поможет вам.