2013-11-21 2 views
1

У меня есть ScrollViewer где отображается содержание страницы. Внутри у меня есть DataGrid, но когда я помещаю DataGrid внутри ScrollViewer, ширина столбцов теряется. Поэтому я прочитал здесь h ttp://stackoverflow.com/questions/17875765/wpf-scrollviewer-around-datagrid-affects-column-width , что мне нужно привязать ширину родительского элемента к моему DataGrid, и все в порядке, но в чем проблема. При увеличении ширины окна увеличивается ширина DataGrid, но при уменьшении ширины окна ширина DataGrid не изменяется. То, что я хотел бы иметь, это когда ширина ширины изменения DataGrid также изменяется.WPF: изменение ширины datagrid внутри ScrollViewer

Это пример XAML:

<Window x:Class="WpfApplication1.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"> 
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
    <!--Page Content--> 
     <Grid x:Name="grid"> 
      <DataGrid Width="{Binding ElementName=grid, Path=ActualWidth}"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Width="*" Header="Header 1" /> 
        <DataGridTextColumn Width="*" Header="Header 2" /> 
        <DataGridTextColumn Width="*" Header="Header 3" /> 
        <DataGridTextColumn Width="*" Header="Header 4" /> 
        <DataGridTextColumn Width="*" Header="Header 5" /> 
        <DataGridTextColumn Width="*" Header="Header 6" /> 
        <DataGridTextColumn Width="*" Header="Header 7" /> 
       </DataGrid.Columns> 
      </DataGrid> 
     </Grid> 
    </ScrollViewer> 
</Window> 

Редакция: Теперь мой MainWindow выглядит следующим образом:

<Window x:Class="WpfApplication1.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" 
     xmlns:my="clr-namespace:WpfApplication1" 
     x:Name="window1"> 
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
     <my:MyGrid /> 
    </ScrollViewer> 
</Window> 

и мой контроль:

<UserControl x:Class="WpfApplication1.MyGrid" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <DataGrid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ActualWidth}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Width="*" Header="Header 1" /> 
       <DataGridTextColumn Width="*" Header="Header 2" /> 
       <DataGridTextColumn Width="*" Header="Header 3" /> 
       <DataGridTextColumn Width="*" Header="Header 4" /> 
       <DataGridTextColumn Width="*" Header="Header 5" /> 
       <DataGridTextColumn Width="*" Header="Header 6" /> 
       <DataGridTextColumn Width="*" Header="Header 7" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</UserControl> 

ответ

4

попробовать этот подход:

<Window x:Class="WpfApplication1.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" 
     x:Name="window1"> 
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
    <!--Page Content--> 
      <DataGrid Width="{Binding ElementName=window1, Path=ActualWidth}"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Width="*" Header="Header 1" /> 
        <DataGridTextColumn Width="*" Header="Header 2" /> 
        <DataGridTextColumn Width="*" Header="Header 3" /> 
        <DataGridTextColumn Width="*" Header="Header 4" /> 
        <DataGridTextColumn Width="*" Header="Header 5" /> 
        <DataGridTextColumn Width="*" Header="Header 6" /> 
        <DataGridTextColumn Width="*" Header="Header 7" /> 
       </DataGrid.Columns> 
      </DataGrid> 
    </ScrollViewer> 
</Window> 

Будет ли этот костюм лучше?

+0

Хорошо работает, как я хочу, но что делать, если у меня DataGrid отображается в UserControl? Width = "{Binding ElementName = ShellView, Path = ActualWidth}" в UserControl для меня не работает. – mardok

+0

Рад, что он работает. Не стесняйтесь проголосовать за полезные приветствия или отметить один как ответ. Вам нужно будет показать мне, как вы используете этот UserControl. Как выглядит xaml этого usercontrol? –

+0

Это немного сложно, потому что я использую Caliburn.Micro, который я изучаю;). У меня есть , которые отображают мой UserControl, и я пытаюсь получить window1 или ShellView в моем случае. – mardok

0

Вышеупомянутое решение почти сработало для меня, за исключением дополнительных полос прокрутки (внутренних из DataGrid и внешних из ScrollViewer). Внутренние были скрыты раньше, потому что Window.ActualWidth и ActualHeight немного слишком велики. Размер DataGrid должен быть немного меньше размера окна, из-за внешней границы окна. Конвертер можно использовать для вычитания 25 из ширины и 42 с высоты.

Мое рабочее решение оказалось на основе кода. Извините, я понимаю, что все работают в xaml. Но я отправлю его в случае, если кто-то любопытно, как сделать то же самое в коде ...

class FindResultsGrid : Window 
{ 
    public FindResultsGrid(List<FindResultLine> list) 
    { 
     var dg = new DataGrid() 
     { 
      AutoGenerateColumns = false, 
      Height = 450, // starting size, will be dynamic based on window... 
      Width = 900, 
      SelectionMode= DataGridSelectionMode.Single 
     }; 
     this.Width = dg.Width + 25; 
     this.Height = dg.Height + 42; 

     dg.AddColumn("Item", "ItemName", width: 151); 
     dg.AddColumn("Line #", "lineNbr", width: 51); 
     dg.AddColumn("Text", "lineText"); 

     dg.SetBinding(DataGrid.WidthProperty, new Binding("ActualWidth") { Source = this, Converter=new WidthConversion() }); 
     dg.SetBinding(DataGrid.HeightProperty, new Binding("ActualHeight") { Source = this, Converter=new HeightConversion() }); 

     this.Content = dg; 

     dg.ItemsSource = list; 
    } 
} 
class WidthConversion : IValueConverter 
{ 
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((double)value) - 25.0; 
    } 
    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } 
} 
class HeightConversion : IValueConverter 
{ 
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((double)value) - 42; 
    } 
    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } 
} 


public static class MyExtensions 
{ 
    public static DataGridTextColumn AddColumn(this DataGrid dg, string header, 
     string propertyPath = null, 
     double width = Double.NaN, 
     BindingMode way = BindingMode.OneWay, 
     bool canUserSort = true) 
    { 
     if (propertyPath == null) 
      propertyPath = header; 
     var binding = new System.Windows.Data.Binding(propertyPath); 
     binding.Mode = way; 
     var col = new DataGridTextColumn() 
     { 
      Header = header, 
      Binding = binding, 
      Width = Double.IsNaN(width) ? DataGridLength.Auto : new DataGridLength(width), 
      CanUserSort = canUserSort 
     }; 
     dg.Columns.Add(col); 
     return col; 
    } 
0

Попробуйте это: Я был также имеющий тот же вопрос при использовании DataGrid вместе с ScrollViewer. Установите свойство HorizontalScrollBarVisibility для ScrollViewer равным 'Disabled'. Он работает, когда ширина увеличивается, а также когда она уменьшается.

Смежные вопросы