2009-12-11 74 views
16

文本換行我試圖創建在Silverlight 4測試版的簡單數據網格,但似乎無法弄清楚如何讓我Note列換行。如何在Silverlight DataGridTextColumn

表表示一個訂單上做筆記,所以他們將是可變長度的。我想讓'Note'單元格垂直擴展以適應內容。

我發現很多類似的問題,但沒有答案。 Silverlight 4中有什麼新東西可以解決這個問題嗎?

<data:DataGrid AutoGenerateColumns="False" Name="dataGrid1" IsReadOnly="True"> 
     <data:DataGrid.Columns> 
      <data:DataGridTextColumn Header="Date" Binding="{Binding Date}" /> 
      <data:DataGridTextColumn Header="User" Binding="{Binding User}" /> 
      <data:DataGridTextColumn Header="Note" Binding="{Binding Note}" /> 
     </data:DataGrid.Columns> 
    </data:DataGrid> 

回答

24

使用DataGridTemplateColumn而不是文本列。有一個TextBlock在那裏它的TextWrapping設置爲true:

<data:DataGrid x:Name="LayoutRoot" AutoGenerateColumns="False" IsReadOnly="True" RowDetailsVisibilityMode="Visible" > 
     <data:DataGrid.Columns> 

      <data:DataGridTextColumn Header="Date" Binding="{Binding Date}" /> 
      <data:DataGridTextColumn Header="User" Binding="{Binding User}" /> 

      <data:DataGridTemplateColumn Header="Note" Width="100"> 
       <data:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
          <TextBlock TextWrapping="Wrap" Text="{Binding Note}" /> 
        </DataTemplate> 
       </data:DataGridTemplateColumn.CellTemplate> 
      </data:DataGridTemplateColumn> 

     </data:DataGrid.Columns> 
    </data:DataGrid> 
+1

如果您的DataGrid上沒有設置RowHeight,將會導致滾動問題。 – 2011-05-05 16:41:08

+1

如果將DataGrid高度設置爲auto,並將數據網格包裝在ScrollViewer中,則不會出現任何滾動問題。 – Jesse 2011-06-22 18:03:03

+0

我試過你的解決方案,但它導致異常,我正在使用silverlight 4 – 2014-06-18 11:18:31

20

我使用ElementStyle來設置換行文本,它的工作原理是正確的。快樂的編碼!

<Style x:Key="DataGridTextColumnStyle" TargetType="TextBlock"> 
    <Setter Property="TextWrapping" Value="Wrap"/> 
</Style> 

<data:DataGridTextColumn Binding="{Binding DESC}" 
     Header="Short Description" 
     HeaderStyle="{StaticResource DataGridHeaderStyle}" 
     ElementStyle="{StaticResource DataGridTextColumnStyle}" > 
</data:DataGridTextColumn> 
+1

一個很好的解決方案,避免了創建模板。 – 2010-06-02 07:38:04

+1

如果您的DataGrid上沒有設置RowHeight,將會導致滾動問題。 – 2011-05-05 16:41:03

2

其他解決方案中的任何一個都可以工作 - 但它們都會導致滾動問題。

如果您有沒有的rowHeight設置一個DataGrid,則行高度將受到這些的TextBlocks的大小決定。那麼,DataGrid中使用虛擬化,他們都顯示,直到不繪製的TextBlocks。所以它根本不知道滾動條應該有多大。用鼠標中鍵滾動,然後會引發各種不幸的行爲。

我使用分頁對我的DataGrid,所以我禁用虛擬化,將DataGrid的樣式設置爲這樣:

xmlns:dataprimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data" 
    xmlns:SystemWindowsControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"> 

    <UserControl.Resources> 

     <Style x:Key="DataGridStyleNoVirtualization" TargetType="SystemWindowsControls:DataGrid"> 
      <Setter Property="RowBackground" Value="#AAEAEFF4" /> 
      <Setter Property="AlternatingRowBackground" Value="#00FFFFFF" /> 
      <Setter Property="Background" Value="#FFFFFFFF" /> 
      <Setter Property="HeadersVisibility" Value="Column" /> 
      <Setter Property="HorizontalScrollBarVisibility" Value="Auto" /> 
      <Setter Property="VerticalScrollBarVisibility" Value="Auto" /> 
      <Setter Property="SelectionMode" Value="Extended" /> 
      <Setter Property="CanUserReorderColumns" Value="True" /> 
      <Setter Property="CanUserResizeColumns" Value="True" /> 
      <Setter Property="CanUserSortColumns" Value="True" /> 
      <Setter Property="AutoGenerateColumns" Value="True" /> 
      <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" /> 
      <Setter Property="BorderBrush"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FFA3AEB9" Offset="0"/> 
         <GradientStop Color="#FF8399A9" Offset="0.375"/> 
         <GradientStop Color="#FF718597" Offset="0.375"/> 
         <GradientStop Color="#FF617584" Offset="1"/> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="BorderThickness" Value="1" /> 
      <Setter Property="DragIndicatorStyle"> 
       <Setter.Value> 
        <!-- TODO: Change the TargetType to Control when the fix Jolt bugs 18719 is verified --> 
        <Style TargetType="ContentControl"> 
         <Setter Property="Foreground" Value="#7FFFFFFF" /> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <!-- TODO: Change the TargetType to Control when the fix Jolt bugs 18719 is verified --> 
           <ControlTemplate TargetType="ContentControl"> 
            <Grid> 
             <vsm:VisualStateManager.VisualStateGroups> 
              <vsm:VisualStateGroup x:Name="SortStates"> 
               <vsm:VisualState x:Name="Unsorted" /> 
               <vsm:VisualState x:Name="SortAscending"> 
                <Storyboard> 
                 <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0"/> 
                </Storyboard> 
               </vsm:VisualState> 
               <vsm:VisualState x:Name="SortDescending"> 
                <Storyboard> 
                 <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0"/> 
                 <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="(RenderTransform).ScaleY" Duration="0" To="-.9"/> 
                </Storyboard> 
               </vsm:VisualState> 
              </vsm:VisualStateGroup> 
             </vsm:VisualStateManager.VisualStateGroups> 

             <Rectangle x:Name="BackgroundRectangle" Stretch="Fill" Fill="#66808080" Grid.ColumnSpan="2" /> 

             <Rectangle x:Name="BackgroundGradient" Stretch="Fill" Grid.ColumnSpan="2" Opacity="0" > 
              <Rectangle.Fill> 
               <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1"> 
                <GradientStop Color="#FFFFFFFF" Offset="0.015" /> 
                <GradientStop Color="#F9FFFFFF" Offset="0.375" /> 
                <GradientStop Color="#E5FFFFFF" Offset="0.6" /> 
                <GradientStop Color="#C6FFFFFF" Offset="1" /> 
               </LinearGradientBrush> 
              </Rectangle.Fill> 
             </Rectangle> 

             <Grid HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}"> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition/> 
               <ColumnDefinition Width="Auto" /> 
              </Grid.ColumnDefinitions> 

              <ContentPresenter Content="{TemplateBinding Content}"/> 

              <Path Grid.Column="1" Name="SortIcon" Fill="#7FFFFFFF" RenderTransformOrigin=".5,.5" HorizontalAlignment="Left" VerticalAlignment="Center" Opacity="0" Stretch="Uniform" Width="8" Margin="4,0,0,0" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z "> 
               <Path.RenderTransform> 
                <ScaleTransform ScaleX=".9" ScaleY=".9" /> 
               </Path.RenderTransform> 
              </Path> 
             </Grid> 
            </Grid> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="DropLocationIndicatorStyle"> 
       <Setter.Value> 
        <Style TargetType="ContentControl"> 
         <Setter Property="Background" Value="#FF3F4346"/> 
         <Setter Property="Width" Value="2"/> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="ContentControl"> 
            <Rectangle Fill="{TemplateBinding Background}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"/> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="GridLinesVisibility" Value="Vertical" /> 
      <Setter Property="HorizontalGridLinesBrush" Value="#FFC9CACA" /> 
      <Setter Property="IsTabStop" Value="True" /> 
      <Setter Property="VerticalGridLinesBrush" Value="#FFC9CACA" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="SystemWindowsControls:DataGrid"> 
         <Grid> 
          <vsm:VisualStateManager.VisualStateGroups> 
           <vsm:VisualStateGroup x:Name="CommonStates"> 
            <vsm:VisualState x:Name="Normal"/> 
            <vsm:VisualState x:Name="Disabled"> 
             <Storyboard> 
              <DoubleAnimation Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
             </Storyboard> 
            </vsm:VisualState> 
           </vsm:VisualStateGroup> 
          </vsm:VisualStateManager.VisualStateGroups> 
          <Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="2"> 
           <Grid Name="Root" Background="{TemplateBinding Background}"> 
            <Grid.Resources> 
             <!--Start: TopLeftHeaderTemplate--> 
             <ControlTemplate x:Key="TopLeftHeaderTemplate" TargetType="dataprimitives:DataGridColumnHeader"> 
              <Grid Name="Root"> 
               <Grid.RowDefinitions> 
                <RowDefinition/> 
                <RowDefinition/> 
                <RowDefinition Height="Auto" /> 
               </Grid.RowDefinitions> 
               <Border BorderThickness="0,0,1,0" BorderBrush="#FFC9CACA" Background="#FF1F3B53" Grid.RowSpan="2"> 
                <Rectangle Stretch="Fill" StrokeThickness="1"> 
                 <Rectangle.Fill> 
                  <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1"> 
                   <GradientStop Color="#FCFFFFFF" Offset="0.015" /> 
                   <GradientStop Color="#F7FFFFFF" Offset="0.375" /> 
                   <GradientStop Color="#E5FFFFFF" Offset="0.6" /> 
                   <GradientStop Color="#D1FFFFFF" Offset="1" /> 
                  </LinearGradientBrush> 
                 </Rectangle.Fill> 
                </Rectangle> 
               </Border> 
               <Rectangle VerticalAlignment="Bottom" Width="Auto" StrokeThickness="1" Height="1" Fill="#FFDBDCDC" Grid.RowSpan="2"/> 
              </Grid> 
             </ControlTemplate> 
             <!--End: TopLeftHeaderTemplate--> 

             <!--Start: TopRightHeaderTemplate--> 
             <ControlTemplate x:Key="TopRightHeaderTemplate" TargetType="dataprimitives:DataGridColumnHeader"> 
              <Grid Name="RootElement"> 
               <Grid.RowDefinitions> 
                <RowDefinition/> 
                <RowDefinition/> 
                <RowDefinition Height="Auto" /> 
               </Grid.RowDefinitions> 
               <Border BorderThickness="1,0,0,0" BorderBrush="#FFC9CACA" Background="#FF1F3B53" Grid.RowSpan="2"> 
                <Rectangle Stretch="Fill"> 
                 <Rectangle.Fill> 
                  <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1"> 
                   <GradientStop Color="#FCFFFFFF" Offset="0.015" /> 
                   <GradientStop Color="#F7FFFFFF" Offset="0.375" /> 
                   <GradientStop Color="#E5FFFFFF" Offset="0.6" /> 
                   <GradientStop Color="#D1FFFFFF" Offset="1" /> 
                  </LinearGradientBrush> 
                 </Rectangle.Fill> 
                </Rectangle> 
               </Border> 
              </Grid> 
             </ControlTemplate> 
             <!--End: TopRightHeaderTemplate--> 
            </Grid.Resources> 

            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto" /> 
             <RowDefinition/> 
             <RowDefinition Height="Auto" /> 
             <RowDefinition Height="Auto" /> 
            </Grid.RowDefinitions> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto" /> 
             <ColumnDefinition/> 
             <ColumnDefinition Width="Auto" /> 
            </Grid.ColumnDefinitions> 

            <dataprimitives:DataGridColumnHeader Name="TopLeftCornerHeader" Template="{StaticResource TopLeftHeaderTemplate}" Width="22" /> 
            <dataprimitives:DataGridColumnHeadersPresenter Name="ColumnHeadersPresenter" Grid.Column="1"/> 
            <dataprimitives:DataGridColumnHeader Name="TopRightCornerHeader" Grid.Column="2" Template="{StaticResource TopRightHeaderTemplate}" /> 
            <Rectangle Name="ColumnHeadersAndRowsSeparator" Grid.ColumnSpan="3" VerticalAlignment="Bottom" Width="Auto" StrokeThickness="1" Height="1" Fill="#FFC9CACA"/> 

            <ScrollViewer Grid.ColumnSpan="2" Grid.Row="1"> 
             <dataprimitives:DataGridRowsPresenter Name="RowsPresenter" /> 
            </ScrollViewer> 

            <Rectangle Name="BottomRightCorner" Fill="#FFE9EEF4" Grid.Column="2" Grid.Row="2" /> 
            <Rectangle Name="BottomLeftCorner" Fill="#FFE9EEF4" Grid.Row="2" Grid.ColumnSpan="2" /> 

            <Grid Grid.Column="1" Grid.Row="2"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="Auto" /> 
              <ColumnDefinition/> 
             </Grid.ColumnDefinitions> 
             <Rectangle Name="FrozenColumnScrollBarSpacer" /> 
            </Grid> 

           </Grid> 
          </Border> 
          <Border x:Name="DisabledVisualElement" IsHitTestVisible="False" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" CornerRadius="2" Background="#8CFFFFFF" Opacity="0"/> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
</UserControl.Resources> 
0

要解決你可以強烈地設置TextBlock的高度屬性滾動的問題,例如:

<Style x:Key="DataGridTextColumnStyle" TargetType="TextBlock"> 
    <Setter Property="TextWrapping" Value="Wrap"/> 
    <Setter Property="Height" Value="15"/> 
</Style>