我们有一些代码成功地使用了Xceed的WPF datagrid v.3.8。当我们更新到他们的v.5.2数据网格时,我们丢失了一个功能。我想要做的就是将网格列标题标题包装为两行。我们在列管理器单元上设置了一个ContentTemplate来执行此操作,它适用于应用程序启动。但是,当您将列标题从屏幕滚动然后再返回视图时,ContentTemplate格式似乎会丢失。
正如我所说,相同的代码适用于早期版本的网格。 Xceed不会帮助我们解决这个问题,因为我们在Windows窗体上托管WPF网格(这是他们首先提出的建议)。
Xceed数据网格位于.XAML UserControl上。在UserControl.Resources中,我像这样定义DataTemplate:
<DataTemplate x:Key="columnManagerCellContentTemplate">
<TextBlock Text="{Binding}" TextWrapping="WrapWithOverflow" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</DataTemplate>
我为ColumnManagerCell定义了一个Style来设置一个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 :(得分: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>
因此,您可以使用所需的文本包装和/或背景来修改它。
答案 1 :(得分:0)
Net Dev在以下帖子中提供的答案提供了正确的方法: 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>