我在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();
}
答案 0 :(得分:3)
可视化树中的每个元素都有Parent
和VisualParent
属性 - 因为所有元素都基于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.Parent或Panel.Children。
我认为没有直接的方法可以获得兄弟姐妹,但是在父母的孩子列表中得到索引并获得下一个项目并不难。