質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

8655閲覧

[WPF]ListBoxのサイズをAutoにすると、スクロールバーが有効にならない

omikuji-iot

総合スコア48

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

1クリップ

投稿2022/03/05 06:53

<開発環境>
・Visual Studio WPF(.NET Framework C#)
・XAMLでGridにListBoxを書いています。

<やりたいこと>
このような画面
・ウィンドウの大きなに伴って、ListBoxも大きさが変わります。
・このListBoxにItem(テキストボックス)を追加していくと、垂直にリスト(列)が追加されます。
・リストがウィンドウからはみ出すとスクロールバーが出て、すべての項目を見ることができます。

<直面している問題>
ListBoxのHeightを"Auto"にし、ウィンドウに伴ってListBoxの大きさは可変しますが、いくらItemを追加して列数が増えてもスクロールバーが表示されません。

色々試すと、
・MaxHeightを超えたときにスクロールバーが出る模様
・ListBoxのプロパティであるScrollViewer.VerticalScrollBarVisibilityを"Visible"にしても、灰色の非有効なスクロールバーのまま
とうことまで分かりました。

<聞きたいこと>
どうすればちょうど画面からはみだしたときにスクロールバーが効くようになるでしょうか?

<コード>

【XAML】
<Grid>
<ListBox x:Name="cmd_ListBox" ItemsSource="{Binding Path=ListString}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="5" Width="Auto" Height="Auto" MinWidth="400" MinHeight="400">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Text}" Margin="2" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>

※c#側でItemsSourceに画面からはみ出る数のテキストを追加しています。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2022/03/05 07:47

MinWidth・MinHeightは何のために入れているんでしょう? ListBoxの見た目のサイズがそれより小さくなっているんじゃないでしょうか(スクロールバーがはみ出ていて見えなくなっている)
omikuji-iot

2022/03/06 22:39

デザインの制約上いれております。これを外しても現象は変わらないようです。
guest

回答1

0

ベストアンサー

デザインの制約上いれております。これを外しても現象は変わらないようです。

提示コードだけでは再現できません(全体のxamlを提示いただければ調整させていただきますが)

ListBox(等スクロールバーがあるもの)は、基本的に(MinMaxも)サイズは入れないほうがレイアウトしやすいです。
StackPanelに入れるなら(縮んでしまうため)サイズが必要ですが、あまり入れることもないんじゃないでしょうか。

常にStretchされている状態というか、空間を占有しているのが望ましいです。

大きさを制御したい場合は、入れる器側(GridならColumnDefinitionRowDefinition)でやったほうがわかりやすいと思います。

xml

1<Window 2 x:Class="Quw227jbd3fzvq1.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="810" 6 Height="450"> 7 <Grid> 8 <Grid.RowDefinitions> 9 <RowDefinition Height="3*" MaxHeight="400" /> 10 <RowDefinition /> 11 </Grid.RowDefinitions> 12 <Grid.ColumnDefinitions> 13 <ColumnDefinition /> 14 <ColumnDefinition MinWidth="400" /> 15 </Grid.ColumnDefinitions> 16 <ListBox 17 x:Name="cmd_ListBox" 18 Width="Auto" 19 Height="Auto" 20 MinWidth="400" 21 MinHeight="400" 22 Margin="5" 23 HorizontalContentAlignment="Stretch" 24 VerticalContentAlignment="Stretch" 25 ItemsSource="{Binding Path=ListString}" 26 ScrollViewer.HorizontalScrollBarVisibility="Auto" 27 ScrollViewer.VerticalScrollBarVisibility="Auto"> 28 <ListBox.ItemTemplate> 29 <DataTemplate> 30 <StackPanel Orientation="Horizontal"> 31 <TextBlock Margin="2" Text="{Binding Text}" /> 32 </StackPanel> 33 </DataTemplate> 34 </ListBox.ItemTemplate> 35 </ListBox> 36 37 38 <ListBox 39 Grid.Column="1" 40 Margin="5" 41 HorizontalContentAlignment="Stretch" 42 VerticalContentAlignment="Stretch" 43 ItemsSource="{Binding ListString}"> 44 <ListBox.ItemTemplate> 45 <DataTemplate> 46 <StackPanel Orientation="Horizontal"> 47 <TextBlock Margin="2" Text="{Binding Text}" /> 48 </StackPanel> 49 </DataTemplate> 50 </ListBox.ItemTemplate> 51 </ListBox> 52 53 </Grid> 54</Window>

cs

1using System.Collections.Generic; 2using System.Linq; 3using System.Windows; 4 5namespace Quw227jbd3fzvq1 6{ 7 public class Item 8 { 9 public string Text { get; set; } 10 } 11 12 public partial class MainWindow : Window 13 { 14 public List<Item> ListString { get; } 15 16 public MainWindow() 17 { 18 InitializeComponent(); 19 DataContext = this; 20 ListString = Enumerable.Range(1, 20).Select(x => new Item { Text = $"Item{x}" }).ToList(); 21 } 22 } 23}

アプリ画像

投稿2022/03/07 04:01

編集2023/07/30 05:01
TN8001

総合スコア10022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omikuji-iot

2022/03/07 06:11

コードまで提示いただきありがとうございました。 諸事情で実際のコードは出せないのですが、ListViewを納めているGrid.RowDefinitionsで Height="Auto"としており、それを外すとうまくいきました。 ウィンドウの外まで内部的に描画してしまうケースがあるのかも知れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問