簡體   English   中英

從C#代碼動態切換WPF網格列的可見性

[英]Dynamically toggle visibility of WPF grid column from C# code

我的問題是:我無法找到如何切換WPF網格列的可見性。 假設遵循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>

Aferwards網格中充滿了一些控件等。現在我想從C#代碼中動態隱藏一列。 我已經嘗試通過將列的定義寬度設置為零來實現此目的,例如Column1.Width = 0 這有效,但我真的不喜歡這個解決方案 - 真的沒有更好的方法嗎?

我正在尋找類似myGrid.Columns[0].Visibility = COLLAPSED東西myGrid.Columns[0].Visibility = COLLAPSEDColumn1.Visibility = HIDDEN 我只是找不到那樣的東西 - 任何想法?

最簡單的方法是在要隱藏的相關列中添加一個命名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>

更新>>>

沒有必要像這樣重新排列主Grid ......您可以輕松地添加兩個Grid控件,相關列的每一行中一個,然后將它們的Visibility設置在一起:

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

您甚至可以在主Grid每個單元格中添加Grid Grid並可以完全控制任何時候可見的單元格。

<ColumnDefinition>
  <ColumnDefinition.Style>
    <Style TargetType="ColumnDefinition">
      <Setter Property="Width" Value="*" />
        <Style.Triggers>
          <DataTrigger Binding="{Binding IsColumnVisible}" Value="False">
            <Setter Property="Width" Value="0" />
          </DataTrigger>
        </Style.Triggers>
    </Style>
  </ColumnDefinition.Style>
</ColumnDefinition>

請在ViewModel中實現INotifyPropertyChanged

WPF網格列和行隱藏代碼項目中,它們顯示了使用依賴項屬性的方法。 它們設置Visible = false ,但在內部,它設置Width = 0

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

一個丑陋的黑客就是將寬度改為0(看不見,不在乎)。

你不應該這樣做有很多原因,但根據你的情況,這可能就足夠了!

使用以下隱藏網格。 同樣,您可以使用Name屬性隱藏行定義和列定義。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM