2013-11-21 47 views
1

我有ScrollViewer其中顯示頁面內容。裏面我有一個DataGrid,但是當我把DataGrid裏面的ScrollViewer列的寬度丟失了。所以我在這裏參考h ttp://stackoverflow.com/questions/17875765/wpf-scrollviewer-around-datagrid-affects-column-width ,我需要將父寬度綁定到我的DataGrid並且沒關係,但是問題是什麼。 當窗口寬度增加時DataGrid的寬度也增加但窗口寬度減小時DataGrid的寬度不變。我想要的是當DataGrid的寬度變化時寬度也改變了。WPF:調整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> 

編輯: 現在我的主窗口的樣子:

<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?在UserControl中的Width =「{Binding ElementName = ShellView,Path = ActualWidth}」不適用於我。 – mardok

+0

很好用。隨意投票有幫助的答案或標記爲答案。您將不得不向我展示如何使用該UserControl。那個用戶控件的xaml是怎麼樣的? –

+0

這有點複雜,因爲我使用我正在學習的Caliburn.Micro;)。我有它顯示我的UserControl和他們我試圖獲得window1或ShellView在我的情況。 – mardok

0

上述解決方案几乎爲我工作,除了有額外的滾動條(DataGrid的內部滾動條和ScrollViewer的外部滾動條)。因爲Window.ActualWidth和ActualHeight有點太大,所以之前隱藏了內部的。由於Window的外部邊界,DataGrid的大小需要比Window的大小小一些。一個轉換器可以用來從寬度減去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

試試這個: 與ScrollViewer中使用以及數據網格時,我也有同樣的問題。 將ScrollViewer的Horizo​​ntalScrollBarVisibility屬性設置爲'Disabled'。它在寬度增加和減少時起作用。

相關問題