隐藏除一个以外的所有控件

时间:2012-07-11 15:45:14

标签: c# wpf xaml mvvm pixelsense

假设我有这个XAML代码:

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

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

如何在后面的代码中隐藏所有那些TextBox,解除一个nammed A.

我不是要求这个回应:

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

我想要一些通用的东西,可以为所有人做这些,而不知道他们的名字?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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