2014-03-06 88 views
0

我们有一些代码成功地使用Xceed的WPF数据网格v.3.8。当我们更新到他们的v.5.2数据网格时,我们失去了一个功能。我想要做的就是将网格列标题标题包装为两行。我们在列管理器单元上设置了一个ContentTemplate来执行此操作,并且它在应用程序启动时起作用。但是,当您将列标题从屏幕上滚动并返回到视图时,ContentTemplate格式化似乎会丢失。如何在Xceed WPF datagrid单元上设置ContentTemplate?

正如我所说的,相同的代码适用于早期版本的网格。 Xceed不会帮助我们解决这个问题,因为我们在Windows窗体上(这是他们的第一个建议)托管WPF网格。

Xceed datagrid位于.XAML UserControl上。在UserControl.Resources我定义的DataTemplate这样的:

<DataTemplate x:Key="columnManagerCellContentTemplate"> 
    <TextBlock Text="{Binding}" TextWrapping="WrapWithOverflow" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
</DataTemplate> 

我定义了一个样式为ColumnManagerCell设立ColumnManagerCell加载事件处理程序:

<Style TargetType="{x:Type xcdg:ColumnManagerCell}"> 
    <EventSetter Event="Loaded" Handler="ColumnManagerCell_Loaded"/> 
</Style> 

而在.XAML.cs文件用户控件我有ColumnManagerCell_Loaded事件处理程序的的ContentTemplate分配给ColumnManagerCells:

internal void ColumnManagerCell_Loaded(object sender, RoutedEventArgs e) 
{ 
    ColumnManagerCell columnManagerCell = sender as ColumnManagerCell; 

    if (columnManagerCell != null) 
    { 
     if (columnManagerCell.ContentTemplate == null) 
     { 
      columnManagerCell.ContentTemplate = (DataTemplate)this.FindResource("columnManagerCellContentTemplate"); 
     } 
    } 
} 

这是一个被记录在案的所有代码Xceed很久以前。正如我所说的,它可以在我启动应用程序时正确地将长列标题换成2行。但是,当我将列标题从视图中滚动出来然后再回到视图中时,格式化就不见了。

我也可以在DataTemplate中设置TextBlock的背景颜色,它在启动时工作,然后在将标题滚动到视图之外后也消失。

任何人都有关于如何让这些设置持续存在的建议?我试着在TextBlock上设置一个IsVisibleChanged事件处理程序,并重置该处理程序中的TextWrapping属性(我发现它在那时是“无”),但这并没有改变这种情况。

任何建议表示赞赏。

感谢,

马克

回答

0

您可以覆盖默认的模板和设置ContentTemplate那里反映您的要求来代替。这些包含在Xceed安装中(位于主题文件夹下)。

如果您找到包含ColumnManagerCell模板的.xaml,则可以复制该模板并根据需要对其进行修改。例如下面的代码段用于提供语言翻译能力列标题:

<StackPanel x:Name="contentPanel" Orientation="Horizontal"> 
    <!-- Same ContentPresenter as in the base Cell Template. --> 
    <!--<xcdg:CellContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />--> 
    <!--The following contentpresenter uses the language converter --> 
    <ContentPresenter> 
    <ContentPresenter.Content> 
     <TextBlock Text="{TemplateBinding Content, Converter={StaticResource LanguageTranslationConverter}}"/> 
    </ContentPresenter.Content> 
    </ContentPresenter>  

    <ContentPresenter x:Name="sortGlyphPresenter" 
        Content="{x:Null}" 
        ContentTemplate="{x:Null}" /> 

    <ContentPresenter x:Name="sortIndexGlyphPresenter" 
        TextBlock.Foreground="{TemplateBinding Foreground}" 
        Content="{Binding Path=(xcdg:Cell.ParentCell).ParentColumn.SortIndex, RelativeSource={RelativeSource Self}, Converter={StaticResource IntAdditionConverter}, ConverterParameter=1}" 
        ContentTemplate="{x:Null}" 
        Margin="3,0,0,0" 
        Visibility="Collapsed" />           
</StackPanel> 

所以,你可以用你需要的textwrapping和或背景进行修改。

0

由Net开发以下职位所提供的答案提供了正确的方法: Styling the Xceed ColumnManagerCell

因为UI虚拟化,性能不应该直接对细胞设置,而是通过风格。例如:

 <Style TargetType="{x:Type xcdg:ColumnManagerCell}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ContentControl"> 
        <TextBlock Text="{TemplateBinding ContentControl.Content}" 
           TextWrapping="Wrap" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
相关问题