2013-12-17 71 views
0

我正在使用WPF Xaml應用程序。該應用程序有各種堆棧面板(表現得像圖標),我需要根據特定標準更改可見性。XAML摺疊所有子元素

問題: 如何摺疊所有子元素(stackpanels)? 我在vb.net的後端逐個崩潰。但更重要的是找到一種很酷的方式一次完成。

回答

2

在這種情況下,你可以有兩種選擇

  1. 您可以通過風格實現它(如果你結合這不會工作,如果你下面MVVM,這是)
  2. 創建coustom控制

隨着風格:

與用於顯示圖像的目標類型收件樣式如下

<Window.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
    </Style> 
    </Window.Resources> 
    <Grid> 
    <StackPanel> 
     <TextBox Height="26" Width="200" Name="text1"/> 
     <TextBox Height="26" Width="200" Name="text2"/> 
     <Button Height="26" Width="200" Click="Button_Click_2" /> 
    </StackPanel> 
    </Grid> 

文本框默認情況下會倒塌,你可以把它可見基於後端代碼搜索

自定義控制:

這將是隻爲你的使用,以顯示曾經控制的包裝圖標但只有一個更改是默認的可見性將被摺疊。然後,你可以把它曾經看到你想要的

覆蓋隱藏已有能見度用默認值的屬性倒塌

+0

好吧,不是我心中所想的,但我想我可以從這裏接。你的想法會崩潰所有的文本框?我會嘗試在我想要隱藏的元素上添加一些鍵,並讓xaml處理隱藏。謝謝你的幫助 – CogentP

1

使用類似BooleanToVisibilityConverterIValueConverter實現將它們綁定。

如果這還不夠好,你將不得不一一做。也許寫一個自定義行爲?

1

您可以設置能見度父,而不是將其設置爲每個控制

例如

<StackPanel> 
     <StackPanel Name="pane1"> 
      <Button Height="30" Width="200" Content="one" Click="Button_Click" /> 
     </StackPanel> 
     <StackPanel Name="panel2"> 
      <Button Height="30" Width="200" Content="two" Click="Button_Click_1" /> 
     </StackPanel> 
    </StackPanel> 

在你後端的編寫邏輯來設置的StackPanel,而不是每個控件的知名度

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     pane1.Visibility = Visibility.Collapsed; 
     panel2.Visibility = Visibility.Visible; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     panel2.Visibility = Visibility.Collapsed; 
     pane1.Visibility = Visibility.Visible; 
    } 

如果您的以下mvvm然後綁定到堆疊面板的可見性屬性,如下所示

<StackPanel> 
     <StackPanel Visibility="{Binding CanShowPanel1}"> 
      <Button Height="30" Width="200" Content="one" Click="Button_Click" /> 
     </StackPanel> 
     <StackPanel Visibility="{Binding CanShowPanel2}"> 
      <Button Height="30" Width="200" Content="two" Click="Button_Click_1" /> 
     </StackPanel> 
    </StackPanel> 
+0

這不會真的有效。如果我隱藏WrapPanel,裏面的圖標會自動隱藏。但我想保持WrapPanel可見,所以稍後我可以選擇要顯示的圖標和要隱藏的內容。綁定它的一個顯示全部或不顯示任何交易。我錯了嗎? – CogentP

+0

能否請你用一個例子來解釋你的需求,然後很容易理解你實際想要做什麼 – Kumareshan

+0

好的。我有一個WrapPanel,有一堆圖標。我正在創建一個通用搜索字段,只顯示與用戶查詢相關的圖標。要做到這一點,我必須先隱藏所有圖標,然後再顯示那些圖標。我正在一次性隱藏所有圖標,以減少我需要編寫的代碼量。 – CogentP

0

這樣做是使用IValueConverter與參數的最簡單方法。

<StackPanel> 
     <StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MyFirstStackPanelVisible"}}"> 
     </StackPanel> 
     <StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MySecondStackPanelVisible"}}"> 
     </StackPanel> 
    </StackPanel> 


public class QueryConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     switch((string)parameter) 
     { 
      case "MyFirstStackPanelVisible" 
      bool result =CheckQueryCriteriaForFirstStackPanel(); 
      return Visibility.Visible or Visibility.Collapsed; 

      case "MySecondStackPanelVisible" 
      bool result =CheckQueryCriteriaForSecondStackPanel(); 
      return Visibility.Visible or Visibility.Collapsed; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

當然,你不應該爲每個案例做CheckQueryCriteriaFor ...函數。 這種方法保證邏輯在一個地方。