Я изменил код, присутствующий в принятом ответе здесь, чтобы вернуть первый найденный элемент управления определенного типа. Но когда я пытаюсь начать перемещение из самого окна, VisualTreeHelper.GetChildrenCount
возвращает 0
, хотя на нем есть сетка. Модификации, которые я сделал, не влияют на результат.
Вот как я называю метод:
DockPanel panel = UIHelper.FindFirstChild<DockPanel>(this);
И вот мой код XAML:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="216" Width="267">
<Grid>
<DockPanel Height="200" Width="250">
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Background="LightBlue">
<Button Content="01" Margin="1 1 15 1"/>
<Button Content="02" Margin="1"/>
<Button Content="03" Margin="1"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="25" DockPanel.Dock="Bottom" Background="LightBlue">
<TextBlock VerticalAlignment="Center">Processing...</TextBlock>
<ProgressBar Value="75" Width="100" Margin="4"/>
</StackPanel>
<Grid>
<TextBlock>Content area</TextBlock>
</Grid>
</DockPanel>
</Grid>
</Window>
Поскольку вы вызываете его в дереве конструктора, визуальное дерево еще не готово. Вы должны вызвать его в Window.Loaded
event вместо
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DockPanel panel = UIHelper.FindFirstChild<DockPanel>(this);
Console.WriteLine(VisualTreeHelper.GetChildrenCount(panel)); //returns 3
}
System.Windows.Controls.Border
, а неGrid
...Border
? У вас нетBorder
но это часть макетаWindow
по умолчанию, например, но выDockPanel