风格没有第一次应用

时间:2013-05-23 14:46:34

标签: wpf styles controltemplate

我正在构建网格列,并且有一些列具有自定义模板,一些列具有默认模板。

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

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

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>    

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

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

任何想法。

1 个答案:

答案 0 :(得分:0)

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

使用键创建了一个新样式,使其基于默认样式。凡使用这种新风格的定制款式都无法使用。它有效。