none
关于DataGrid列宽 RRS feed

  • 问题

  • DataGrid的列可以拖动改变宽度,怎么获取该宽度,因为我想在文字超过列宽时有省略号表示
    2012年12月25日 2:20

答案

全部回复

  • 把 Text 模式设置为 Wrapper。
    2012年12月25日 3:53
  • 我是想在文字超过列宽的时候用省略号表示。不是要显示全部文字
    2012年12月25日 5:22
  • 这个不是通过grid的列宽控制的,这个是要判断textblock本身的text是不是完全显示了,这里有一个完整的例子和详细的解释如何去做,作者是重建了一个新的DP叫做IsTextTrimmed,去验证是不是完全显示了

    http://tranxcoder.wordpress.com/2008/10/09/showing-tooltips-on-a-trimmed-textblock-wpf/

    http://tranxcoder.wordpress.com/2008/10/12/customizing-lookful-wpf-controls-take-2/


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月25日 8:59
    版主
  • 改变datagrid列宽,文字自动显示列宽补全信息

    2012年12月27日 1:52
  • http://www.codeproject.com/Articles/309927/WPF-TextBox-With-Ellipsis

    怎么会这么麻烦呢?

    Winform的DataGridView,如果不指定 Wrapper 为 False 的话,超出的文字会自动显示为省略号。

    2012年12月27日 3:14
  • <TextBoxx:Name="tbPopup"Grid.Column="0"VerticalAlignment="Center"Height="25"VerticalContentAlignment="Center">
        <TextBox.Resources>
            <VisualBrushx:Key="backgroundBrush"Stretch="None"AlignmentX="Left"  >
                <VisualBrush.Visual>
                    <LabelWidth="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=ActualWidth}"
                           Height="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=ActualHeight}"
                           Padding="3.7,0,2.7,0"Background="White"VerticalContentAlignment="Center">
                           <TextBlockText="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Text}"
                                      TextTrimming="CharacterEllipsis"Foreground="Black"
                                      FontFamily="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=FontFamily}"
                                      FontSize="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=FontSize}"
                                      FontWeight="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=FontWeight}"/>
                    </Label>
                </VisualBrush.Visual>
             </VisualBrush>

             <StyleTargetType="{x:Type TextBox}">
                 <SetterProperty="Background"Value="{StaticResource backgroundBrush}"/>
                 <SetterProperty="Foreground"Value="Transparent"/>
                 <Style.Triggers>
                     <TriggerProperty="IsFocused"Value="True">
                         <SetterProperty="Background"Value="White"/>
                         <SetterProperty="Foreground"Value="{Binding RelativeSource={RelativeSource AncestorType=TextBlock}, Path=Foreground}"/>
                     </Trigger>
                 </Style.Triggers>
             </Style>
         </TextBox.Resources>
    </TextBox>

    为你的 TextBox 使用此样式模板。                            
    2012年12月27日 3:18
  • DataGrid列宽度可以自己拖动,有没相关事件触发。

    2012年12月27日 3:34
  • <DataGridTemplateColumn Header="{x:Static lang:Resources.Name}" Width="244" >
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                            <StackPanel Orientation="Horizontal" Height="50">
                                                <!--<Image Source="../resources/contacts.png" Stretch="None"></Image>-->
                                                <Image Source="{Binding ContactImg,Converter={StaticResource ContactImgConverter}}"  Width="30" Height="30"></Image>
                                                <StackPanel VerticalAlignment="Center" Margin="10,0,0,0">
                                                    <TextBlock Text="{Binding NameWithCount}" VerticalAlignment="Center" Height="18">
                                                    </TextBlock>
                                                    <TextBlock Text="{Binding LastSMS.body}" VerticalAlignment="Center" Height="18"></TextBlock>
                                                </StackPanel>
                                            </StackPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

    2012年12月27日 3:36
  • 你用个全局样式就可以了,或者命名样式,不用考虑什么拖动事件。
    2012年12月27日 3:49
  • 这个样式是什么意思,和我那个貌似没什么关系,况且,我的那个也不是TextBox
    2012年12月27日 3:54
  • 这个我说了应该是在你的TextBlock上做文章,当TextBlock的Text 没有全部显示的时候你是知道的, 所以你可以在这个时候去显示ToolTip去显示没有显示的信息。

    我给你提供的博客那个人是注册了一个IsTextTrim的依赖属性,然后通过这个属性去检测TextBlock是不是Text全部显示了,有了这个属性你的问题很容易做。

    你为什么非要纠结DataGrid 列的宽度改变事件,去操作列的宽度,这是很不正确的做法,最最根本的问题就是WPF的DataGrid就没有column的概念,可能你不理解这么说的原因, 其实,WPF所有控件都是一维的,包括DataGrid,它是一个ItemsControl,对于DataGrid而言 他只有Item的概念,也就是DataGridRow,它不会关心自己的Column,因为它是一个一维的ItemsControl,这里你非要操作column这个是很难做的,也是不正确的做法,我建议你看看VisualTree:

    你不会找到DataGridColumn的。

    如果你非要找到sizechanged的事件, 那么你就在你的HeaderTemplate里面的StackPanel上面注册SizeChanged事件,这样会按照你的想法去进行,我建议你把我的回复看完,然后自己哪个概念不懂去看看然后再继续讨论。


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月27日 4:54
    版主
  • 这个样式是什么意思,和我那个貌似没什么关系,况且,我的那个也不是TextBox

    你把它改成 TextBlock 就行了。TextTrimming="CharacterEllipsis" 属性。

    设置全局样式后,只要你不显式指定,你的应用程序上所有的TextBlock或TextBox都将就具有该样式。

    如果不想全部都这样,你可以在你需要的TextBlock或TextBox上用名称标识要使用的样式。

    2012年12月27日 5:06
  • 我知道要在TextBlock上做文章,但是TextBlock默认的宽度是很长的,我原本是希望可以获得datagrid的列宽再设置TextBlock的宽度。你提供的两个网址我这边都是提示连接超时的错误。

    <DataGridTemplateColumn Header="{x:Static lang:Resources.Name}" Width="244" >
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                            <StackPanel Orientation="Horizontal" Height="50">
                                                <!--<Image Source="../resources/contacts.png" Stretch="None"></Image>-->
                                                < Image Source="{Binding ContactImg,Converter={StaticResource ContactImgConverter}}"  Width="30" Height="30"></Image>
                                                <StackPanel VerticalAlignment="Center" Margin="10,0,0,0">
                                                    <TextBlock Text="{Binding NameWithCount}" VerticalAlignment="Center" Height="18">
                                                    </TextBlock>
                                                    <TextBlock Text="{Binding LastSMS.body}" VerticalAlignment="Center" Height="18"></TextBlock>
                                                </StackPanel>
                                            </StackPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>

    2012年12月27日 6:22
  • 我知道要在TextBlock上做文章,但是TextBlock默认的宽度是很长的,我原本是希望可以获得datagrid的列宽再设置TextBlock的宽度。你提供的两个网址我这边都是提示连接超时的错误。

    <DataGridTemplateColumn Header="{x:Static lang:Resources.Name}" Width="244" >
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                            <StackPanel Orientation="Horizontal" Height="50">
                                                <!--<Image Source="../resources/contacts.png" Stretch="None"></Image>-->
                                                < Image Source="{Binding ContactImg,Converter={StaticResource ContactImgConverter}}"  Width="30" Height="30"></Image>
                                                <StackPanel VerticalAlignment="Center" Margin="10,0,0,0">
                                                    <TextBlock Text="{Binding NameWithCount}" VerticalAlignment="Center" Height="18">
                                                    </TextBlock>
                                                    <TextBlock Text="{Binding LastSMS.body}" VerticalAlignment="Center" Height="18"></TextBlock>
                                                </StackPanel>
                                            </StackPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>


    你可以把 TextBlock Width 绑定到 Colunm 的 Width 上,你也可以用 Margin 来指定 TextBlock 的相对宽度,所以 TextBlock 不可能很长,它的宽度应该随着 Column 的宽度改变。
    2012年12月27日 6:25
  • 能不能把TextBlock的width 绑定到TextBlock的ActualWidth上,但是以为刚开始加载的时候他的actualwidth是不确定的,所以能不能在xaml上有一种类似Notifychange的机制,可以当actualwidth更改的时候实现实时通知
    2012年12月27日 6:36
  • 我看不懂你的问题,Actuanlwidth变得时候绑定会自动更新的,比如:

    <Window x:Class="WpfApplication37.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:System="clr-namespace:System;assembly=mscorlib"
             xmlns:local="clr-namespace:WpfApplication37"
            xmlns:toolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
            Title="MainWindow" Name="window" Height="350" Width="525" Tag="{Binding ActualWidth, RelativeSource={RelativeSource Self}}" >
        <Grid >
            <TextBlock Text="{Binding Tag, ElementName=window}"/>
        </Grid>
    </Window>

    你改变window大小的时候TextBlcok的Text属性也会变。实在实在你不理解,你自己加个binding converter就明白了


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月27日 6:46
    版主
  • 能不能把TextBlock的width 绑定到TextBlock的ActualWidth上,但是以为刚开始加载的时候他的actualwidth是不确定的,所以能不能在xaml上有一种类似Notifychange的机制,可以当actualwidth更改的时候实现实时通知

    个人感觉你路走偏了,你还是先把你的需求说清楚吧,别先把你假设的解决方案说出来。
    2012年12月27日 6:47
  • 你前一个回复说TextBlock会很长,这个你可以把宽度绑定到DataGridCell上,

    比如width={binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridCell}, Path=ActualWidth}


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Leo06053308 2012年12月27日 7:23
    2012年12月27日 6:48
    版主
  • 对,我现在就是用这个方法,效果是可以的

    2012年12月27日 7:14
  • good luck,解决了就好,我会标记我第一回复为answer,因为我觉得那个是比较好的解决方案。

    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2012年12月27日 7:21
    版主