2013-04-18 20 views
5

Tôi có một điều khiển người dùng trong WPF có một DataGrid. Tôi thêm điều khiển người dùng này vào Cửa sổ bên trong TabItem của TabControl. Thanh cuộn dọc không hiển thị. Tôi thay đổi kích thước cửa sổ và có vẻ như điều khiển người dùng đang lấy chiều cao hoàn chỉnh của nó sau khi xem xét chiều cao của DataGrid.scrollbar dọc không apearing trong datagrid bên trong usercontrol trong wpf

Làm thế nào để làm cho thanh cuộn dọc xuất hiện và vẫn giữ chiều cao của DataGrid để tự động tùy thuộc vào độ cao có sẵn theo chiều cao của điều khiển người dùng và cửa sổ?

EDIT: Main Window:

<Window> 
    <Grid> 
    <TabControl Name="tc" 
       SelectionChanged="tc_SelectionChanged"> 
     <TabItem Header="ABC"> 
     <local:uc1 /> 
     </TabItem> 
     <TabItem Header="DEF"> 
     <local:uc2 /> 
     </TabItem> 
    </TabControl> 
    </Grid> 
</Window> 

Bản quyền thuộc về:

<UserControl> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="30"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="2*"></ColumnDefinition> 
     <ColumnDefinition Width="*"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <StackPanel Grid.Row="0" 
       Grid.Column="0" 
       Orientation="Vertical"> 
     <StackPanel Orientation="Horizontal"> 
     <Button>Add</Button> 
     <Button>Remove</Button> 
     <Button>Refresh</Button> 
     </StackPanel> 

     <Label Name="lblTopMessage">some message</Label> 

     <DataGrid Name="dg" 
       IsReadOnly="True"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Name}" 
           Header="Name" 
           Width="*"></DataGridTextColumn> 
      <DataGridTextColumn Binding="{Binding Value}" 
           Header="Value" 
           Width="130"></DataGridTextColumn> 
      <DataGridTextColumn Binding="{Binding List}" 
           Header="List" 
           Width="*"></DataGridTextColumn> 
     </DataGrid.Columns> 
     </DataGrid> 

    </StackPanel> 
    <Grid Grid.Row="0" 
      Grid.Column="1" 
      Name="gridTS"> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="100"></ColumnDefinition> 
     <ColumnDefinition Width="*"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <TextBlock Name="lblNewSource" 
       Grid.Row="0" 
       Grid.ColumnSpan="2" 
       HorizontalAlignment="Center" 
       Padding="0 5 0 0" 
       FontWeight="Bold">New Source</TextBlock> 
     <TextBlock Grid.Row="1" 
       Grid.Column="0" 
       Padding="10 10 0 0">Name:</TextBlock> 
     <TextBlock Grid.Row="2" 
       Grid.Column="0" 
       Padding="10 10 0 0">Value:</TextBlock> 
     <TextBlock Grid.Row="3" 
       Grid.Column="0" 
       Padding="10 10 0 0">List:</TextBlock> 

     <TextBox Grid.Row="1" 
       Grid.Column="1" 
       Name="txtName" 
       IsEnabled="False"></TextBox> 
     <ComboBox Grid.Row="2" 
       Grid.Column="1" 
       Name="cbValue"></ComboBox> 
     <ListBox Grid.Row="3" 
       Grid.Column="1" 
       Name="lbList"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
      <CheckBox Margin="3 5 0 3" 
         Content="{Binding Name}" 
         IsChecked="{Binding IsActive}" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
     </ListBox> 

     <Button Name="btnSave" 
       Click="btnSave_Click" 
       Grid.Row="4" 
       Grid.Column="1">Save</Button> 
     <TextBlock TextWrapping="WrapWithOverflow" 
       Name="lblMessage" 
       Grid.Row="5" 
       Grid.Column="1" 
       Margin="0 10 10 0"></TextBlock> 
    </Grid> 
    </Grid> 
</UserControl> 
+1

Bạn có thể muốn thiết lập của DataGrid [VerticalScrollBarVisibility] (http://msdn.microsoft.com/en-us/library/ system.windows.controls.datagrid.verticalscrollbarvisibility (v = vs.95) .aspx) thành ** Hiển thị ** nhưng thật khó để nói dựa trên thông tin bạn cung cấp. –

+0

Tôi nghĩ rằng việc đưa DataGrid vào trong StackPanel không phải là ý tưởng hay trong trường hợp này.Bạn sẽ không thể sử dụng DataGrid với ScrollBars. – Dilshod

+0

có thể trùng lặp của [làm cách nào tôi có thể bật thanh cuộn trên Bảng dữ liệu WPF?] (Http://stackoverflow.com/questions/673516/how-can-i-enable-scrollbars-on-the-wpf-datagrid) – Dzyann

Trả lời

8

CẬP NHẬT: Tôi chỉ mất DataGrid ra khỏi StackPanel. Hãy thử mã này:

<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="45.361"></RowDefinition> 
    <RowDefinition Height="102.639" /> 
    <RowDefinition Height="30"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="2*"></ColumnDefinition> 
    <ColumnDefinition Width="*"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <StackPanel Grid.Row="0" 
       Grid.Column="0" 
       Orientation="Vertical"> 
    <StackPanel Orientation="Horizontal"> 
     <Button>Add</Button> 
     <Button>Remove</Button> 
     <Button>Refresh</Button> 
    </StackPanel> 

    <Label Name="lblTopMessage">some message</Label> 

    </StackPanel> 

    <DataGrid Grid.Row="1" 
      Name="dg" 
      IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Name}" 
          Header="Name" 
          Width="*"></DataGridTextColumn> 
     <DataGridTextColumn Binding="{Binding Value}" 
          Header="Value" 
          Width="130"></DataGridTextColumn> 
     <DataGridTextColumn Binding="{Binding List}" 
          Header="List" 
          Width="*"></DataGridTextColumn> 
    </DataGrid.Columns> 
    </DataGrid> 

    <Grid Grid.Row="0" 
     Grid.Column="1" 
     Name="gridTS" 
     Grid.RowSpan="2"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="100"></ColumnDefinition> 
     <ColumnDefinition Width="*"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <TextBlock Name="lblNewSource" 
       Grid.Row="0" 
       Grid.ColumnSpan="2" 
       HorizontalAlignment="Center" 
       Padding="0 5 0 0" 
       FontWeight="Bold">New Source</TextBlock> 
    <TextBlock Grid.Row="1" 
       Grid.Column="0" 
       Padding="10 10 0 0">Name:</TextBlock> 
    <TextBlock Grid.Row="2" 
       Grid.Column="0" 
       Padding="10 10 0 0">Value:</TextBlock> 
    <TextBlock Grid.Row="3" 
       Grid.Column="0" 
       Padding="10 10 0 0">List:</TextBlock> 

    <TextBox Grid.Row="1" 
      Grid.Column="1" 
      Name="txtName" 
      IsEnabled="False"></TextBox> 
    <ComboBox Grid.Row="2" 
       Grid.Column="1" 
       Name="cbValue"></ComboBox> 
    <ListBox Grid.Row="3" 
      Grid.Column="1" 
      Name="lbList"> 
     <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Margin="3 5 0 3" 
        Content="{Binding Name}" 
        IsChecked="{Binding IsActive}" /> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

    <Button Name="btnSave" 
      Grid.Row="4" 
      Grid.Column="1">Save</Button> 
    <TextBlock TextWrapping="WrapWithOverflow" 
       Name="lblMessage" 
       Grid.Row="5" 
       Grid.Column="1" 
       Margin="0 10 10 0"></TextBlock> 
    </Grid> 
</Grid> 

Tôi hy vọng điều đó sẽ hữu ích.

0

Đặt VerticalScrollBarVisibility thành Visible.

<DaraGrid VerticalScrollBarVisibility="Visible" ... > 
... 
</DataGrid> 

Giá trị mặc định là Auto.

CẬP NHẬT

Sau khi xem xét mã của bạn tôi phát hiện ra, đó cuộn visibility không phải là vấn đề thực sự của bạn. Vấn đề của bạn là DataGrid không có chiều cao cố định trong StackPanel. Phải mất tất cả không gian cần thiết cho tất cả các mục trong DataGrid để được hiển thị và đó là lý do tại sao ScrollBar không phải là Visible. Như tôi đã nói giá trị mặc định trước cho VerticalScrollBarVisibilityAuto và nó có nghĩa là:

MSDN: Auto - Một ScrollBar xuất hiện và kích thước của ScrollViewer được áp dụng cho nội dung khi viewport không thể hiển thị tất cả Nội dung.

4

Làm cho thanh cuộn dọc xuất hiện và vẫn giữ chiều cao tự động của DataGrid.
Câu trả lời là KHÔNG.

Miễn là chiều cao tự động, nó sẽ phát triển thành tự động nghĩa là tôi nhận được tất cả chiều cao mà tôi muốn.

<RowDefinition Height="Auto"></RowDefinition> 

Nếu bạn muốn nó để sử dụng không gian có sẵn sau đó sử dụng *

<RowDefinition Height="*"></RowDefinition> 
Các vấn đề liên quan