Доброго времени суток! Сразу предупреждаю, код ниже был написан чисто в учебных целях. Прошу не задавать вопросы, вроде: "Зачем вообще это нужно?" и т.д. Для интересующихся этим вопросом скажу откровенно - любопытно как можно реализовать подобного рода логику. Программированием увлекаюсь недавно, прошу строго не судить (хотя можно и строго, не обижусь ). Сейчас начал ковырять WPF и наткнулся на такого рода проблему - определяю атрибут Uid для объектов Label, далее хочу в коде через итерацию назначать данным Label'ам значения. То есть запустил итерацию и по целочисленному значению в коде ищу нужный мне Лейбл. Но как оказалось в WPF такой логики не предусмотрено. Подсмотрев кое что на stackowerflow наковырял вот такую расширяющую функцию:
| Код | public static UIElement FindUid(this DependencyObject parent, string uid) { var count = VisualTreeHelper.GetChildrenCount(parent); if (count == 0) return null;
for (int i = 0; i < count; i++) { var el = VisualTreeHelper.GetChild(parent, i) as UIElement; if (el == null) continue;
if (el.Uid == uid) return el;
el = el.FindUid(uid); if (el != null) return el; } return null; }
|
На этом моя проблема не решилась. Долго бодался с тем что VisualTreeHelper.GetChildrenCount() не возвращал количество наследников. Пришлось добавить ивент txtBlockWithLabels_Loaded в мейн видоу и в него поместить вызов вышеуказанной функции.
| Код | private void txtBlockWithLabels_Loaded(object sender, RoutedEventArgs e) { try { var el = (Label)txtBlockWithLabels.FindUid("0"); el.Content = "We did it!";
} catch (Exception ex) { MessageBox.Show(ex.Message); } }
|
Но и теперь остались вопросы. var el = VisualTreeHelper.GetChild(parent, i) as UIElement; <-- в данном фрагменте кода преобразование не происходит и переменная el остается null. При явном преобразовании компилятор ругается. Почему? Ведь насколько я понимаю класс UIElement расширяет класс DependencyObject а Лейбл в свою очередь расширяет UIElement. Должно работать. Разметка XAML ниже. Прошу, разъясните где я допустил ошибку.
| Код | <Window x:Name="MyWindow" x:Class="PhoneNumber_1._1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:PhoneNumber_1._1" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <DockPanel LastChildFill="True"> <Viewbox DockPanel.Dock="Bottom" > <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <Button x:Name="btnStart" Content="Start" Click="btnStart_Click"/> <Button x:Name="btnStop" Content="Stop"/> <Button x:Name="btnReset" Content="Reset"/> </StackPanel> </Viewbox> <Slider DockPanel.Dock="Bottom" x:Name="mySlider" Minimum="1" Maximum="100" BorderThickness="40"/> <Viewbox DockPanel.Dock="Top"> <TextBlock x:Name="txtBlockWithLabels" Loaded="txtBlockWithLabels_Loaded"> <Label x:Uid="0" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="1" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="2" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="3" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="4" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="5" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="6" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="7" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="8" BorderThickness="2" BorderBrush="Blue"/> <Label x:Uid="9" BorderThickness="2" BorderBrush="Blue"/> </TextBlock> </Viewbox> </DockPanel> </Window>
|
P.S. УПС! Похоже случайно не там разместил тему. Хотел тут --> http://forum.vingrad.ru/forum/dotnet-WPF.html Прошу простить, на форумах редкий гость. Переместить теперь не знаю как. |