0

我正在设置网格列的样式,有些列带有自定义模板,有些带有默认模板。

第一次加载视图时,样式不会应用于具有默认模板的列,但是如果我在网格中添加/删除列(在运行时),我可以看到样式应用于所有列。

我的代码后面定义了以下附加属性

public static readonly DependencyProperty GridLinesBorderBrushProperty = DependencyProperty.RegisterAttached("GridLinesBorderBrush", typeof(SolidColorBrush), typeof(CarbonBlotter), new PropertyMetadata(Brushes.Transparent));

public static readonly DependencyProperty GridLinesBorderThicknessProperty = DependencyProperty.RegisterAttached("GridLinesBorderThickness", typeof(Thickness), typeof(CarbonBlotter), new PropertyMetadata(new Thickness(0)));

public SolidColorBrush GetGridLinesBorderBrush(UIElement element_)
{
  return (SolidColorBrush)element_.GetValue(GridLinesBorderBrushProperty);
}

public void SetGridLinesBorderBrush(UIElement element_, SolidColorBrush value_)
{
  element_.SetValue(GridLinesBorderBrushProperty, value_);
}

public Thickness GetGridLinesBorderThickness(UIElement element_)
{
  return (Thickness)element_.GetValue(GridLinesBorderThicknessProperty);
}

 private void ShowGridLines()
    {
      UserSettings.GridLineType gridLineType = _userSettings.ShowGridLines;
      Thickness gridLinesBorderThickness = new Thickness(0, 0, 1, 1);
      if (gridLineType == UserSettings.GridLineType.Off)
      {
        SetGridLinesBorderThickness(_grid, new Thickness(0));
        SetGridLinesBorderBrush(_grid, Brushes.Transparent);
        SetAllowGridLines(_grid, false);
      }
      else (gridLineType == UserSettings.GridLineType.Black)
      {
        SetGridLinesBorderThickness(_grid, gridLinesBorderThickness);
        SetGridLinesBorderBrush(_grid, Brushes.Black);
        SetAllowGridLines(_grid, true);
      }      
    }

在我的 Xaml 上,我有一个默认模板

<Style TargetType="ig:CellValuePresenter" BasedOn="{StaticResource {x:Type ig:CellValuePresenter}}">
      <Setter Property="Background" Value="Transparent"/>
      <Setter Property="BorderThickness" Value="{Binding Path=DataPresenter.(pwc:CarbonBlotter.GridLinesBorderThickness), RelativeSource={RelativeSource Self}}"/>
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ig:CellValuePresenter}">
            <igw:CardPanel>
              <Border x:Name="MainBorder" CornerRadius="{TemplateBinding CornerRadius}" BorderThickness="{TemplateBinding BorderThickness}" 
                      BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Padding="4"/>
                      ...

我有一些基于默认模板的自定义模板

<Style x:Key="_columnStyle" TargetType="{x:Type ig:CellValuePresenter}" BasedOn="{StaticResource {x:Type ig:CellValuePresenter}}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <Border BorderBrush="{TemplateBinding BorderBrush}" Margin="{TemplateBinding Margin}" BorderThickness="{TemplateBinding BorderThickness}">
        <pwc:BlotterCashTradingLanguageBar/>
        </Border>
        ...
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>    

并且根据列名,将应用默认或自定义模板。而且我发现第一次启动视图时,具有默认模板的列没有边框线,但是如果我通过添加几列来更改视图,则视图会刷新并且所有列都有网格线。

看起来默认模板在第一次加载视图时没有从附加属性中选择值。

有任何想法吗。

4

1 回答 1

0

嗯,很奇怪,试图从各个地方设置附加属性 OnLoad,OnRender,使用 Property Override 从派生类,没有任何效果。

使用键创建新样式,使其基于默认样式。在没有自定义样式的地方使用这种新样式。它有效。

于 2013-05-23T19:08:22.843 回答