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

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

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

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

Q&A

解決済

1回答

5597閲覧

WPFで自動でobjectを積み重ねてくれて、Windowからはみだしたらscroll barを表示してくれるobjectってありますか?

退会済みユーザー

退会済みユーザー

総合スコア0

WPF

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

0グッド

0クリップ

投稿2016/03/02 08:43

Windows7、Visual Studio 2013、WPFで開発しています。
WPFで自動でobjectを積み重ねてくれて、Windowからはみだしたらscroll barを表示してくれるobjectってありますか?
StackPanelを使っていたら、重ねはよいのだけど、ScrollはScrollViewerをネストする必要があることを知り、驚いてます。ScrollViewerで画面からはみ出ないときはgrayでなくてscroll barを消すことって可能ですか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
縦の積み重ねであれば、VerticalScrollBarVisibility=Autoでいけませんか。

XML

1<ScrollViewer VerticalScrollBarVisibility="Auto"> 2 <StackPanel > 3 <TextBox Height="100" Width="200" /> 4 <TextBox Height="100" Width="200" /> 5 </StackPanel> 6</ScrollViewer>

投稿2016/03/02 08:54

編集2016/03/02 08:54
Tak1wa

総合スコア4791

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

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

退会済みユーザー

退会済みユーザー

2016/03/02 08:58

こんにちは。 やっぱり<ScrollViewer>-<StackPanel>のネストは必須ですか?
Tak1wa

2016/03/02 09:03

何のコントロールを包括するかによりますね。 一部のコントロールは、デフォルトのコントロールテンプレートにScrollViewerが含まれているものもあります。(ListBoxとか、DataGridとか) そういったもの以外は必要になります。
Tak1wa

2016/03/02 09:05 編集

StackPanelであればコントロールテンプレート自体無いのでScrollViewerが必要です。
退会済みユーザー

退会済みユーザー

2016/03/03 00:58

ありがとうございます。 いま試しているのですが、ListViewにもScrollViewerは必要でしょうか? <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Hidden"> <ListView /> </ScrollViewer> としてみて、画面からはみ出しているのにScrollbarを表示できないでいます。
退会済みユーザー

退会済みユーザー

2016/03/03 01:16 編集

さらにStackPanelにしても表示を確認できませんでした。 はまってます。 xamlはこんな構造です。 <Window x:Class="wpf.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <Canvas> <Grid Name="grid"> <!--<ListView Name="basePanel" Margin="0,38,0,0"/>--> <ScrollViewer> <StackPanel Name="basePanel" Margin="0,38,0,0"/> </ScrollViewer> </Grid> </Canvas> </Window>
退会済みユーザー

退会済みユーザー

2016/03/03 01:15 編集

さらに。designerで見ていると、Windowの左上にScrollViewerを表示しているのを発見しました。 実行時に、C#でStackPanelにobjectを追加すると、ScrollViewerが見えなくなるようです。 うーむ。 C#のcodeです。 private void layoutStackPanel(){ for (int i = 0; i < 50; i++) { StackPanel childPanel = new StackPanel(); chhildPanel.Width = basePanel.Width; basePanel.Children.Add(childPanel); } }
Tak1wa

2016/03/03 02:40

ListViewはScrillViewerを含んでいます。コントロール別にヒアリングするのは埒が明かないと思いますのでBlend for Visual Studio の使い方を学習するか、MSDNから既定コントロールのテンプレートを調べてください。
Tak1wa

2016/03/03 02:45 編集

何故Canvasの中にGridが入っているのでしょうか。 問題解決においては、余計な要素を取り除いたシンプルな状態からひとつづつ要素を追加していくようにしてください。その上で何が影響しているか切り分けを明確にした上で質問を投稿するよう心掛けて頂いたほうが良いでしょう。
退会済みユーザー

退会済みユーザー

2016/03/03 06:45

ありがとうございます。 なぜ!? と問い詰められても困るのですが。 <Window> <Canvas> ここに固定したコントローラー。再生ボタンとか。 <Grid Name="grid"> < ScrollViewer> <StackPanel Name="basePanel" Margin="0,38,0,0"/> このstackpanel内にcontentsをcodeで追加。 contentsの数は多いのでスクロールしたい。 表示を自動でWindowsのサイズ最大にしたいのでGridとStackPanelを使用。 </ScrollViewer> </Grid> </Canvas> < /Window> という理由です。 コントローラー(固定)とコンテンツ(動的)を分けるのにCanvasとGrid-StackPanelを使うのは、いけないですか? どんな構造にするのがベターでしょう?
Tak1wa

2016/03/03 06:52

聞いた限りではGridにRowを定義して、1行目にコントローラー、2行目にコンテンツで良いと思いますのでCanvasを採用する理由は今のところありません。なのでCanvas採用理由は質問者さんにしかわからないことですので、その点はご配慮ください。 Canvas内に配置したことが問題なのか、Grid内に配置したことが問題なのか、現時点では要素がたくさんあることで可能性がいくつかありますので、そこは手を動かして切り分けをされては如何ですか?と提案させてもらいました。
退会済みユーザー

退会済みユーザー

2016/03/03 07:19

なんと。GridのRowというのはこういうときに使うのですね。 使ったことがなく、ぴんときていませんでした。 GridでなくてCanvasを外側に使った理由は、Canvasは位置をLeft-Topで指定しやすいと感じるのですが、GridではMargenで指定しなければならず、非直感的だと感じているためです。 Canvasのほうが初期の配置はたやすいが、Windowのresizeのときに苦労する、ということでGridを入れ子にして使いました。 Grid-Rowを見てみます。 ありがとうございます。 書籍も確認するので、少し時間かかります。
Tak1wa

2016/03/03 07:23

Canvasを採用した理由はわかりました。 一般的なアプリケーションでは様々なウインドウサイズに対応する要件が多いと思います。そういった背景からも相対比率でレイアウト配置を行えるような方向になるべく調整することをお勧めします。(WindowsFormsから見るとCanvasのほうが配置は楽かもしれませんが) 逆にサイズや位置設定にシビアな数値が求められたり、図形の描画が必要だったりする場合などCanvasのほうが適している場合もありますので今後学習していってみてください。
退会済みユーザー

退会済みユーザー

2016/03/04 07:47 編集

ご示唆いただきありがとうございました。 下記のように構造を見直して、希望の動作を実現できそうです。 GridでなくてDackPanelを使いました。 ありがとうございました。 <Window x:Class="WpfApplication9.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <DockPanel> <Button Content="111" DockPanel.Dock="Top" Background="#ccffcc" /> <ScrollViewer VerticalScrollBarVisibility="Auto" > <StackPanel Name="stackpanel"> //ここにC#で追加。 </StackPanel > </ScrollViewer > </DockPanel> </Window>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問