none
(C#)ListViewのVisibilityをHiddenにしてVisibleにすると文字が表示されなくなります。 RRS feed

  • 質問

  • タイトルの通りListViewのVisibilityをHiddenにしてVisibleにすると文字が表示されなくなってしまいます。

    TreeViewの1を選択するとlistView1をVisible、listView2をHidden、

    TreeViewの2を選択するとlistView1をHidden、listView2をVisible、のようにしているのですが、listViewがHiddenのまま項目を入れるとアイテムは入るのですが、文字が表示されません。

    解決策や、ほかの方法がありましたら教えてください...

    以下にxamlのコードを載せておきます

                <ListView x:Name="listView1" Grid.Column="2" SelectionChanged="listView1_SelectionChanged" Foreground="Black" BorderBrush="Transparent" Background="Transparent">
                    <ListView.Resources>
                        <Style TargetType="GridViewColumnHeader">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </Style>

                        <Style x:Key="{x:Static GridView.GridViewStyleKey}" TargetType="{x:Type ListView}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type ListView}">
                                        <theme:ListBoxChrome Name="Bd"
                                         BorderThickness="{TemplateBinding BorderThickness}"
                                         BorderBrush="{TemplateBinding BorderBrush}"
                                         Background="{TemplateBinding Background}"
                                         RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"
                                         SnapsToDevicePixels="true">
                                            <ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}" Padding="{TemplateBinding Padding}">
                                                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                            </ScrollViewer>
                                        </theme:ListBoxChrome>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsGrouping" Value="true">
                                                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                            </Trigger>
                                            <Trigger Property="IsEnabled" Value="false">
                                                <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ListView.Resources>

                    <ListView.View>
                        <GridView>
                            <GridViewColumn />
                        </GridView>
                    </ListView.View>
                </ListView>

    2018年7月22日 13:29

回答

  • // 列ヘッダを表示せず1列しか使わないのなら、ListViewじゃなくてListBoxで十分な気が…。

    GridViewColumnは列幅(Widthプロパティ)を持ちます。Widthが既定値であるDouble.NaNの場合、アイテムが最初に追加されたときにその追加されたアイテムの横幅(と列ヘッダの横幅の大きい方)を表示幅としますが、このときListViewが非表示状態であれば、表示幅を調節しません。

    列ヘッダが空なので表示幅の初期値は0であり、アイテム追加時に上記の自動調節が動かない結果、アイテムが見えない状態になっているのでしょう。ちなみに表示幅はActualWidthプロパティで確認できます。

    GridViewColumnのWidthがDouble.NaN以外からDouble.NaNに変更されたとき、「現在表示されている行の中で最も大きいアイテムの幅」をもとに表示幅が決定されます(つまりスクロールのビューポート外に行っているアイテムは対象外)。

    なので、Visibilityを変更する際、同時にGridViewColumnのWidthを、一旦Double.NaN以外に変更してからDouble.NaNに設定してやれば列の表示幅を自動調整してくれて、アイテムが表示されるようになるでしょう。

    • 回答としてマーク WPF開発 2018年7月23日 7:25
    2018年7月23日 2:26

すべての返信

  • // 列ヘッダを表示せず1列しか使わないのなら、ListViewじゃなくてListBoxで十分な気が…。

    GridViewColumnは列幅(Widthプロパティ)を持ちます。Widthが既定値であるDouble.NaNの場合、アイテムが最初に追加されたときにその追加されたアイテムの横幅(と列ヘッダの横幅の大きい方)を表示幅としますが、このときListViewが非表示状態であれば、表示幅を調節しません。

    列ヘッダが空なので表示幅の初期値は0であり、アイテム追加時に上記の自動調節が動かない結果、アイテムが見えない状態になっているのでしょう。ちなみに表示幅はActualWidthプロパティで確認できます。

    GridViewColumnのWidthがDouble.NaN以外からDouble.NaNに変更されたとき、「現在表示されている行の中で最も大きいアイテムの幅」をもとに表示幅が決定されます(つまりスクロールのビューポート外に行っているアイテムは対象外)。

    なので、Visibilityを変更する際、同時にGridViewColumnのWidthを、一旦Double.NaN以外に変更してからDouble.NaNに設定してやれば列の表示幅を自動調整してくれて、アイテムが表示されるようになるでしょう。

    • 回答としてマーク WPF開発 2018年7月23日 7:25
    2018年7月23日 2:26
  • ありがとうございます!

    できました!

    2018年7月23日 7:25