WPF, выбор братьев и сестер, как jQuery? - PullRequest
3 голосов
/ 24 апреля 2011

В качестве примера в моем приложении WPF приведен следующий код XAML

<StackPanel Height="23" Name="MSpanel" Orientation="Horizontal" Width="138" Margin="37,13,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" >
    <TextBox Height="23" Name="MTBox" Width="120" Text="0" />
    <ScrollBar Height="23" Name="MSBar" Width="18" TouchUp="SBar_TouchUp" />
</StackPanel>
<StackPanel Height="23" Name="CSPanel" Orientation="Horizontal" Width="138" Margin="37,41,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
    <TextBox Height="23" Name="CTBox" Width="120" Text="0" />
    <ScrollBar Height="23" Name="CSBar" Width="18" TouchUp="SBar_TouchUp" />
</StackPanel>

У меня есть эта функция:

private void SBar_TouchUp(object sender, TouchEventArgs e)
{
    //what goes here?
    //siblings.getFirst('textbox').text += 1;
}

То, что я надеялся сделать, это иметь 1 функцию, которая управляет этими «псевдо» числовыми подъемами в WPF. Если был какой-то способ иметь унифицированную функцию, которая могла бы ссылаться на одноуровневое текстовое поле, так что я должен написать его только один раз. Это было бы идеально.

Я очень хорошо знаком с jQuery, и XAML выглядит как HTML DOM, ... Есть ли способ просмотреть дерево?

Я понимаю, что существуют доступные для загрузки числовые подъемы. Эту идею, я считаю, было бы полезно узнать и о будущем в других начинаниях. Спасибо.


Решение, которое сработало!

private void SBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    if (e.NewValue == 0) return; //abort here, no change

    ScrollBar sb = (ScrollBar)sender;
    StackPanel sp = (StackPanel)sb.Parent;
    TextBox tb = (TextBox)sp.Children[0];

    int change = e.NewValue < 0 ? 1 : -1;
    sb.Value = 0; //this will invoke this function again
    tb.Text = (Convert.ToInt32(tb.Text) + change).ToString();
}

Ответы [ 3 ]

3 голосов
/ 24 апреля 2011

Вы можете сделать что-то вроде этого:

private void SBar_TouchUp(object sender, TouchEventArgs e)
{
    //siblings.getFirst('textbox').text += 1;
    var siblings = ((sender as FrameworkElement).Parent as Panel).Children;
    var textbox = siblings.OfType<TextBox>().First();
    textbox.Text = (int.Parse(textbox.Text) + 1).ToString();
}

но я подозреваю, что, возможно, есть лучшие способы сделать то, что вы хотите, например, привязка данных или именование элементов в прикрепленных свойствах.

3 голосов
/ 24 апреля 2011

Каждый элемент в визуальном дереве имеет свойство Parent и VisualParent - поскольку все элементы основаны на UIElement - любой из них должен давать вам родительский объект.

В этом случае родительский элемент ScrollBar является StackPanel.Затем вы можете использовать свойство Children StackPanel, чтобы получить коллекцию дочерних объектов.Вы знаете, что является ScrollBar (это sender), поэтому другой должен быть TextBox.

0 голосов
/ 24 апреля 2011

Да, существует множество свойств для Логических и Визуальных деревьев .

Как FrameworkElement.Parent или Panel.Children .

Я не думаю, что есть прямой метод для получения брата, но не так сложно получить индекс в списке потомков родителя и получить следующий элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...