2013-10-07 82 views
9

我的問題是:我找不到如何切換我的WPF網格列的可見性。假設下面的XAML標記:從C#代碼動態切換WPF網格列的可見性

<Grid x:Name="myGrid"> 
    <Grid.RowDefinitions> 
     <RowDefinition x:Name="Row1" /> 
     <RowDefinition x:Name="Row2" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="Column1" /> 
     <ColumnDefinition x:Name="Column2" /> 
    </Grid.ColumnDefinitions> 
</Grid> 

Aferwards網格等充斥着一些控件現在我要動態地隱藏單列出來的我的C#代碼。我試圖通過將列的定義寬度設置爲零來實現這一點,例如Column1.Width = 0。這有效,但我不太喜歡這個解決方案 - 有沒有更好的方法?

我在尋找類似myGrid.Columns[0].Visibility = COLLAPSEDColumn1.Visibility = HIDDEN的東西。我找不到像這樣的東西 - 任何想法?

+0

@DaveRook當然,它會這樣做 - 我只是好奇,如果有一個容易的沒有這種攻擊的方法 – sebi

+0

你希望在那一欄中的控件發生什麼? – Dave

+0

@DaveRook在摺疊列時,我想摺疊所有包含的控件 - 因此整個列包括內容應該是不可見的 – sebi

回答

9

最簡單的方法是在要隱藏的相關列中添加一個名爲Grid的頂層控件。然後,你可以將其隱藏和它的所有內容,就像任何其他控制:

在XAML:

<Grid x:Name="myGrid"> 
    <Grid.RowDefinitions> 
     <RowDefinition x:Name="Row1" /> 
     <RowDefinition x:Name="Row2" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="Column1" /> 
     <ColumnDefinition x:Name="Column2" /> 
    </Grid.ColumnDefinitions> 
    <Grid x:Name="GridColumn1" Grid.Column="1"> 
     ... 
    </Grid> 
</Grid> 

然後在後面的代碼:

GridColumn1.Visibility = Visibility.Collapsed; 

當你有一個以上的排在你Grid,你可能要重新排列它們是這樣的:

<Grid x:Name="myGrid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="Column1" /> 
     <ColumnDefinition x:Name="Column2" /> 
    </Grid.ColumnDefinitions> 
    <Grid x:Name="GridColumn0" Grid.Column="0"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
    </Grid> 
    <Grid x:Name="GridColumn1" Grid.Column="1"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
    </Grid> 
</Grid> 

UPDATE >>>

這是不是真的有必要重新整理主Grid這樣的...你可以很容易地添加兩個Grid控件,一個相關的列的每一行中,然後將它們兩者的Visibility在一起:

InnerGrid1.Visibility = InnerGrid2.Visibility = Visibility.Collapsed; 

你甚至可以添加一個Grid到主Grid的每個細胞,並完全控制其細胞是在任何一個時間可見。

+0

是的,我想我必須重新排列XAML代碼以達到我想要的目的 - 儘管這是我試圖避免的,因爲它有很多代碼一些同事..感謝:) – sebi

+0

即使你遇到麻煩,如果你想同時隱藏一列和一行 – sebi

+0

摺疊行/列中的所有元素只有在其高度/寬度設置爲「汽車」。看看:https://www.codeproject.com/articles/437237/wpf-grid-column-and-row-hiding如果你想崩潰。 – David

6

在Code Project的WPF Grid Column and Row Hiding上,他們顯示了使用依賴項屬性的方法。他們設置了Visible = false,但內部設置爲Width = 0

另一個想法是刪除代碼後面的列定義......但我想這是一個更糟糕的黑客! :(

+2

我嘗試刪除列定義本身:網格得到了正確重新安排,但列的內容仍然存在(元素重疊)..但是,謝謝;) – sebi

3

一個醜陋的黑客是隻改變寬度爲0(眼不見,心不煩)。

有很多原因,你不應該這樣做,但是,根據您的情況,它可能足夠

+0

請你分享一些爲什麼只是將高度設置爲零的原因是餿主意? – Palec

-7

使用下面隱藏網格同樣可以使用Name屬性隱藏的行定義和列定義

myGrid.Visibility = System.Windows.Visibility.Hidden;!。

+2

只有一列需要隱藏,而不是整個網格。 – jpierson

+0

請重新閱讀該問題。 –

+0

您不能以這種方式隱藏行/列定義。 –