WPF,兄弟选择像jQuery?

时间:2011-04-24 17:46:41

标签: c# wpf

我在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;
}

我希望做的是,有一个函数可以控制WPF中的这些“Psudo”数字上升。如果有某种方法可以使用统一的函数,可以引用兄弟文本框,所以我只需要编写一次。那将是理想的。

我对jQuery非常熟悉,XAML看起来像一个HTML DOM,...有没有办法浏览树?

我意识到现有的Numeric Up Downs可供下载。我相信这个想法在其他方面也很有用。感谢。


有效的解决方案!

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 个答案:

答案 0 :(得分:3)

可视化树中的每个元素都有ParentVisualParent属性 - 因为所有元素都基于UIElement - 要么应该为您提供父对象。

在这种情况下,ScrollBar的父级是StackPanel。然后,您可以使用StackPanel的{​​{3}}属性来获取子对象的集合。您知道哪个是ScrollBar(它是sender),因此另一个必须是TextBox

答案 1 :(得分:3)

您可以这样做:

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();
}

但我怀疑可能有更好的方法来做你想做的事情,比如附加属性中的数据绑定或命名元素。

答案 2 :(得分:0)

是的,Logical and Visual trees都有很多属性。

FrameworkElement.ParentPanel.Children

我认为没有直接的方法可以获得兄弟姐妹,但是在父母的孩子列表中得到索引并获得下一个项目并不难。