2012-07-11 81 views
0

的控件假设我有这样的XAML代码:隐藏所有除一个

<StackPanel> 
    <s:SurfaceTextBox Name="A" /> 
    <s:SurfaceTextBox Name="B" /> 
</StackPanel> 

<s:ScatterView> 
    <s:SurfaceTextBox Name="C" /> 
    <s:SurfaceTextBox Name="D" /> 
</s:ScatterView> 

如何隐藏在代码中所有的文本框的背后,exept一个nammed A.

我不是要求这个回应:

B.Visibility = Visibility.Hidden; 
C.Visibility = Visibility.Hidden; 
D.Visibility = Visibility.Hidden; 

我想要一个通用的,可以做到这一点,不知道他们的名字?

回答

1

你也许可以做这样的事情:

public void SetVisibility(UIElement parent) 
{ 
    var childNumber = VisualTreeHelper.GetChildrenCount(parent); 

    for (var i = 0; i <= childNumber - 1; i++) 
    { 
     var uiElement = VisualTreeHelper.GetChild(parent, i) as UIElement; 
     var surfaceTextBox = uiElement as SurfaceTextBox; 

     // Set your criteria here 
     if (surfaceTextBox != null && surfaceTextBox.Name != "A") 
     { 
      uiElement.Visibility = Visibility.Collapsed; 
     } 

     if (uiElement != null && VisualTreeHelper.GetChildrenCount(uiElement) > 0) 
     { 
      SetVisibility(uiElement); 
     } 
    } 
} 

给你的根元素的名称:

<Grid x:Name="Root"> 
    <StackPanel> 
     <s:SurfaceTextBox Name="A" /> 
     <s:SurfaceTextBox Name="B" /> 
    </StackPanel> 

    <s:ScatterView> 
     <s:SurfaceTextBox Name="C" /> 
     <s:SurfaceTextBox Name="D" /> 
    </s:ScatterView> 
</Grid> 

,然后调用它像这样:

SetVisibility(Root); 
+0

错误:http://img15.hostingpics.net/pics/418790Error.png – 2012-07-11 16:05:21

+0

对不起。我已经更新了答案。 – 2012-07-11 16:06:38

+0

非常感谢 – 2012-07-12 08:49:02

0

您可以将要隐藏的网格放置在网格中,并将网格设置为隐藏。 另一种方法是将你的可见性绑定到你的代码后面或(希望)你的视图模型中的布尔值。 您需要一个BooleanToVisibility类型的转换器来完成此操作,但它可以让您隐藏无限数量的绑定到该字段的控件。下面是一个例子: Visibility Type Converter

+0

我更新了我的问题。他们不在同一家长控制之下。 – 2012-07-11 15:49:27

+0

如果您创建一个绑定到每个父控件的视图模型,并且包含BooleanToVisibity类型转换器,那么无论控件位于何处,您都可以在一个位置控制它。 – 2012-07-11 15:51:04

+0

你能举一个例子吗? – 2012-07-11 15:52:18

相关问题