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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

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

Q&A

3回答

5015閲覧

WPFのDataGridで横スクロールバーを常に表示したい

takenori.sone

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

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

0グッド

0クリップ

投稿2018/08/02 08:22

編集2018/08/06 00:58

WPFのDataGridで横スクロールバーをデータが無い状態でも常に表示したいのですが、現状では表示されておりません。
(データがあれば表示されます。)
DataGridの属性には「HorizontalScrollBarVisibility="Visible"」を設定してあります。
よいお知恵がありましたらお願いしたく。

追記)
すいません、表示ではなくデータが無い状態で横スクロールバーを操作したいです。
現状では、横スクロールバーは表示されますがデータが無い状態だと無効化されてしまいます。

やりたいこと)
列が複数るときに、画面の幅が足りずに、列が画面の外側にある場合があります。
横スクロールバーでスクロールさせれば画面外の列を表示する事ができます。
データが有る場合には横スクロールバーを表示してくれるのですが、
データが無い場合には横スクロールバーが非表示になるため
画面外の列をスクロールさせて表示することができません。

データが無くとも画面外の列を表示するために、横スクロールバーを表示して操作できるようにしたいです。

やりたいことの追記)
FrozenColumnCount を使用するため、列の一部しか横スクロールさせないようにします。
ScrollViewerでDataGrid全体を囲むとDataGrid全体で横スクロールしてしまうため、
FrozenColumnCount の効果がなくなってしまいます。
そのためScrollViewerで囲む方法を使うことができませんでした。

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

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

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

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

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

ebiryo

2018/08/04 04:06

データが無い = スクロールする対象がない だと思うのですが、「スクロールバーを操作したい」とは何をどう操作したいのですか?
takenori.sone

2018/08/06 00:12

説明不足で申し訳ありません。質問内容を修正します。
guest

回答3

0

DataGridをScrollViewerで囲ってしまえば大丈夫だと思います。
以下でどうでしょうか?

XAML

1<ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Visible"> 2 <DataGrid ... > 3 <DataGrid.Columns> 4 <DataGridTextColumn Header="1" Binding="{Binding _Name}" MinWidth="150"/> 5 <DataGridTextColumn Header="2" Binding="{Binding _Name}" MinWidth="150"/> 6 : 7 <DataGridTextColumn Header="N" Binding="{Binding _Name}" MinWidth="150"/> 8 </DataGrid.Columns> 9 </DataGrid> 10</ScrollViewer>

投稿2018/08/06 00:40

ebiryo

総合スコア797

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

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

takenori.sone

2018/08/06 00:51

ありがとうございます! 横スクロールバーをデータが無い状態でも表示し横スクロールさせる事が出来ました。 ScrollViewer の役割が分かってなかったのですが、学ぶことが出来て大変うれしいです。
takenori.sone

2018/08/06 00:59

大変申し訳ありません。 解決したと思っていたのですが、FrozenColumnCount という列の一部しかスクロールさせない設定のことを忘れておりました。 質問に追記致します。。。
guest

0

手元では表示されているように見えますがこれとは違いますか?

イメージ説明

xaml

1<Window x:Class="WpfApplication18.Window1" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApplication18" 7 mc:Ignorable="d" 8 Title="Window1" Height="300" Width="300"> 9 <Grid> 10 <DataGrid HorizontalScrollBarVisibility="Visible"> 11 <DataGrid.Columns> 12 <DataGridTextColumn Header="ああああ" /> 13 </DataGrid.Columns> 14 </DataGrid> 15 </Grid> 16</Window> 17

投稿2018/08/02 08:28

takabosoft

総合スコア8356

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

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

takenori.sone

2018/08/02 08:44

迅速なご回答に感謝いたします。 サンプルプログラムをありがとうございます。 私の画面を実行してライブビジュアルツリーで調べたところ、 スクロールバーはあるようですのでスタイルか何かが見えないようにしているようです。 スタイルは他の方が作られたので、気がつかずに質問してしまいました。 お騒がせ致しました。
takenori.sone

2018/08/02 08:50

すいません、質問を修正致します。 データが無い状態でも、横スクロールバーを操作したいとのことです。
guest

0

結論

構造的には無理。

その理由

ここからの話は手前解析の結果なので「~だと思う」「~のはず」という語尾ばかりになることをご容赦いただけたら。
ライブビジュアルツリーを見ていらっしゃるとのことなので承知しているかもとは思いますが、DataGridはヘッダ部、データ部、垂直スクロールバー部、水平スクロールバー部の4つに分かれています。
データ部はScrollContentPresenterになっていて、2つのスクロールバーはこの領域と連動するようになっているようです。
対してヘッダ部はおそらくデータ部の水平表示位置に連動して表示領域が動くようになっており、スクロールバーの動きとは直接連動しないようになっているようです。
データ部に表示すべきデータがある(ItemsSourceに何等かのデータが存在している)場合、データ部中のRowsPresenter中にDataGridRowが生成され、その中にデータの表示領域が組まれますが、データが存在しない場合、RowsPresenterの中身は空となり、スクロールバーが連動すべき表示領域が生成されません。スクロールバー(のスライドできる部分)も非表示になります。
よって、データなしの状態でスクロールバーが表示されるようにするには、RowsPresenterの中へDataGridRowを何らかの方法で突っ込んでやればいいのかもしれませんが、私にはちょっとその方法が思いつかないです。
リフレクションをゴリゴリ使えばできるかもしれませんが、相当茨の道になりますし、そこまでの労力に見合うリターンがあるとは思えません。

一方ロシアは

空行を挿入した。

なぜデータ0件の時にヘッダを全部見れなければいけないのか理解しがたいのですが、表示上の問題だけなら空のデータを1件挿入し、DataGridRowごと非表示にしてやればよいのではと思います。

XAML

1 <DataGrid.RowStyle> 2 <Style TargetType="DataGridRow"> 3 <Style.Setters> 4 <Setter Property="Visibility" Value="Hidden"/> 5 </Style.Setters> 6 </Style> 7 </DataGrid.RowStyle>

実際はデータ0件以外の場合も考えてプログラム側でVisiblityを制御したほうが良いかと思いますが、私の環境では上記記述でfrozenした列があってもデータ0件でヘッダのスクロールが実現できました。

結論で無理とは書きましたが、このくらいの小細工でなんとかなるもんです。
あとはくれぐれもこの状態のまま実データを突っ込んだりしないようにしていただければ、と。

投稿2018/08/16 13:41

hope_mucci

総合スコア4447

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問