0

私がこのXAMLコードを持っていると仮定します:

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

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

Aという名前のTextBoxを除いて、コードの背後にあるすべてのTextBoxを非表示にするにはどうすればよいですか。

私はこの応答を求めていません:

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

名前を知らなくても、すべての人にそれを実行できる一般的なものが欲しいですか?

4

2 に答える 2

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);
于 2012-07-11T15:59:30.580 に答える
0

非表示にしたいものをグリッド内に配置し、グリッドを非表示に設定できます。もう1つの方法は、可視性をコードビハインドまたは(できれば)ビューモデルのブール値にバインドすることです。これを実現するにはBooleanToVisibilityタイプコンバーターが必要ですが、そのフィールドにバインドされているコントロールの数に制限はありません。その例を次に示します 。VisibilityTypeConverter

于 2012-07-11T15:46:34.690 に答える