DataGridの境界外にある4つの列を持つ単純なDataGridを作成しましたが、水平スクロールバーが表示されません。各列に幅を設定してみましたが、何も変わりませんでした。これが私のXAMLです:
<Window x:Class="WPFTest.Window1"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<DataGrid Height="200" Width="200" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" />
<DataGridTextColumn Header="Column 2" />
<DataGridTextColumn Header="Column 3" />
<DataGridTextColumn Header="Column 4" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
そして、これが私が得るものです:
DataGridをScrollViewerでラップすることも試みました。何もありません。スクロールバーを表示するにはどうすればよいですか?
Datagrid
が空の場合、ScrollViewer
は何も処理しないと思います。 ItemsSource
を追加して列を埋めてみてください。したがって、スクロールが表示されます:)
また、ヘッダーフィルターを使用しているため、この動作は非常に嫌いです。私の「ハック」は上記よりもはるかに簡単です。データグリッドを新しいScrollViewer
内にHorizontalScrollBarVisibility=Auto
とVerticalScrollBarVisibility=Disabled
を付けて配置するだけです(DataGridはすでにそれをうまく処理しています)。そのようです:
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Disabled">
<DataGrid>
...
</DataGrid>
</ScrollViewer>
確かに、それはページ上のより多くのコントロールですが、上記のハッキーなコードよりもはるかに簡単です。これまでのところ、データグリッドにこれを自動的に実行させる方法は見つかりませんでした。
このソリューションの副作用は、右にスクロールするまで垂直スクロールバーが非表示になることです。
私は多くの列を作成していて、ヘッダーにフィルターコントロールを含めることでユーザーがフィルター処理できるようにしているため、これは実際には私にとって大きな問題でした。
ユーザーが右にスクロールして列にフィルターを配置し、これらの基準のために行が返されない場合、グリッド全体が左に移動し(すべての列がデフォルトの左位置に)、水平スクロールバーが消えてユーザーが表示されますフィルタ列までスクロールしてアクションを元に戻すことはできません!!
大きな痛み!
私がコードに配置した「ハック」はそれを回避する方法です:(DataTableからDataViewを指す_dv)
// construct an overall sql filter statement
string sqlFilter = _setttings.SGColumns.GetFilterSQL();
BindingListCollectionView view = CollectionViewSource.GetDefaultView(gridMain.ItemsSource) as BindingListCollectionView;
if (view != null)
view.CustomFilter = sqlFilter; // "XGROUP = 'E' AND GEOG = 'U'";
if (view != null && _dv.Count == 0)
{
gridMain.ItemsSource = null;
gridMain.Items.Add("hello");
_RowHeightTemp = gridMain.RowHeight;
gridMain.RowHeight = 0;
}
else
{
if (gridMain.Items.Count == 1 && gridMain.Items[0].ToString() == "hello")
{
gridMain.Items.Clear();
gridMain.ItemsSource = _dv;
view = CollectionViewSource.GetDefaultView(gridMain.ItemsSource) as BindingListCollectionView;
view.CustomFilter = sqlFilter;
gridMain.RowHeight = _RowHeightTemp;
}
}
これにより、行が表示されていないときにグリッドが正確な位置にとどまることが保証されます。
グリッドにデータを追加するとすぐに、スクロールが自動的に機能します。テストするには、このコードを適用できます
グリッドに「grid」という名前を付けます
WindowLoadedイベントを添付しました
private void Window_Loaded(object sender, RoutedEventArgs e)
{
grid.Items.Add(new object());
}
スクロールが表示されます。
Datagrid
のプロパティをCanUserAddRows="True" IsReadOnly="True"
として設定し、ScrollViewerでラップします。 CanUserAddRows
は空の行を表示します。空の行はスクロールバーを保持します。 IsReadOnly
は読み取り専用であるため、空の行を非表示にします。
欠点は、垂直方向にスクロールすると、データグリッドヘッダーが非表示になることです。
明らかに、水平スクロールバーが必要です。
2つのことをする必要があります:
1。プロパティIsReadOnly="True"
をDataGridに追加します
2。MaxWidth="1200" VerticalScrollBarVisibility="Auto"
をScrollViewer
に追加します
MaxWidthを設定する必要があります。必要に応じて、1200
を他の値に変更できます。
<ScrollViewer MaxWidth="1200" VerticalScrollBarVisibility="Auto">
<DataGrid IsReadOnly="True">
</DataGrid>
</ScrollViewer>