2011-08-18 26 views
4

这是继我以前的问题一个问题,you can find it right there造型DataGridCell正确

所以。现在,我定义的特定ElementStyle为每列一个DataGrid(这只是定义了大胆&白色TextBlock的内线 - 会过来这个问题后)

所以现在我有两个问题

第一个问题(已解决)

当我碰巧为我的单元格设置背景时,它会覆盖默认样式,并且在单元格高亮显示时背景保持不变。风格的

一个例子:

<!-- Green template for market-related --> 
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}"> 
    <Grid Background="Green"> 
     <ContentPresenter 
         HorizontalAlignment="Center" 
            VerticalAlignment="Center" /> 
    </Grid> 
</ControlTemplate> 

我会自然地说这是“正常”的,因为我设置Grid的背景为绿色。因此我试过这样:

<!-- Light green template for sophis-related --> 
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}"> 
    <Grid Background="LightGreen"> 
     <Grid.Resources> 
      <Style TargetType="{x:Type Grid}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
              Converter={StaticResource DebugConverter}}" Value="True"> 
         <Setter Property="Grid.Background" Value="#FF3774FF" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Grid.Resources> 
     <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Grid> 
</ControlTemplate> 

这也行不通。正如你可以看到我把DebugConverter这样我就可以检查触发实际上是所谓的,是哪种情况,但...背景不会改变(和Snoop证实了这一点......)

第三次尝试:

<!-- Light green template for sophis-related --> 
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}"> 
    <ControlTemplate.Resources> 
     <Style TargetType="{x:Type tk:DataGridCell}"> 
      <Setter Property="Background" Value="LightGreen" /> 
     </Style> 
    </ControlTemplate.Resources> 
    <Grid> 
     <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Grid> 
</ControlTemplate> 

而且......没有背景,将显示(保持透明)

所以我想我在错误的方式在这里工作,我想知道我该怎么做,只是界定“未选择”模板。 我想说我可能需要定义一种基于“经典”风格的风格,但是,我该怎么做呢?我尝试没有成功添加TemplateBindings

**编辑:**解决

由于HB在他的回答,问题是从DependencyProperty的优先级来建议,这里的解决方案:

<!-- Light green template for sophis-related --> 
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}"> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="{x:Type Grid}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
              Converter={StaticResource DebugConverter}}" Value="True"> 
         <Setter Property="Grid.Background" Value="#FF316AC5" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
              Converter={StaticResource DebugConverter}}" Value="False"> 
         <Setter Property="Grid.Background" Value="LightGreen" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Grid.Resources> 
     <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Grid> 
</ControlTemplate> 

二问题

现在,让我们说Triggers

基本上,我想要做的就是定义特定TriggersElementStyle所以字体颜色为白色,如果单元格背景为红色或绿色(这样做的唯一目的是为了有一个更好的可读性红色和绿色是在一个漂亮的深色背景效果有点暗,黑色的字体失败:p)

编辑好像我不够清楚:下面的样式是应用于DataGrid的每一个项目,通过属性DataGridTextColumn.ElementStyle风格。这里是代码处理的是:

void VolatilityDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     DataGridTextColumn column = e.Column as DataGridTextColumn; 
     column.ElementStyle = s_boldCellStyle; 
     // Other stuff here... 
    } 

这里是我做的:

<!-- Cell style for colored matrix--> 
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}}" 
        Value="Red"> 
      <Setter Property="Foreground" Value="White" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
           Converter={StaticResource DebugConverter}}" 
        Value="Green"> 
      <Setter Property="Foreground" Value="White" /> 
     </DataTrigger> 
    </Style.Triggers> 
    <Setter Property="FontWeight" Value="Bold"/> 
</Style> 

而且......它不工作。奇怪的是,通过转换器只是透明背景颜色。我绝对错过了一些东西! 顺便说一句,我也试过用经典的触发器,也没有成功,我在这里使用DataTriggers,所以我可以调试绑定值!

现在我已经遇到这方面的更多超过三天,我开始吓坏了...希望在社区#1将节省我:)

谢谢!

编辑

好吧,更新。 我明白为什么我的Trigger不起作用。实际设置的背景是Grid,而不是DataGridCell。因此,我没有在那里设置任何颜色是正常的。

但是,我跑了一些测试,发现当设置绑定时,TextBlock还没有任何父代(Parent = null)。绑定到类型GridRelativeSource将绑定我...整个DataGrid项目演示者。 我不确定现在要做什么,因为它似乎是从实际的TextBlock风格,我无法达到父Grid,因此无法解决什么颜色,我应该显示根据背景。 此外,我无法更改我的ControlTemplate中的字体颜色,因为DataGrid希望每个列都有Style,这会默认覆盖模板的样式(see my previous question and its answer) 因此...再次卡住我!

回答

3

Dependency Property Value Precedence

此:

<Grid Background="LightGreen"> 
    <Grid.Resources> 
     <Style TargetType="{x:Type Grid}"> 
      <!-- Trigger Stuff --> 
     </Style> 
    </Grid.Resources> 
    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
</Grid> 

需要是:

<Grid> 
    <Grid.Resources> 
     <Style TargetType="{x:Type Grid}"> 
      <Setter Property="Background" Value="LightGreen"/> 
      <!-- Trigger Stuff --> 
     </Style> 
    </Grid.Resources> 
    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
</Grid> 

不知道你截至目前的第二个问题,可能是一个相关的问题,我会建议设置TextElement.Foreground而不是Foreground RS。获取Transparent作为价值不是很有用,您使用什么控制模板DataGridCell?如果是自定义,Background是否通过TemplateBinding正确连接?

只要使用Background属性,就可以使用,所以如果你有一个ControlTemplate它在内部设置东西,你需要将其外化。正常DataGrid例如:

<DataGrid.CellStyle> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="Background" Value="LightGreen"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Content}" Value="Apple"> 
       <Setter Property="Background" Value="Red"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Content}" Value="Tomato"> 
       <Setter Property="Background" Value="Green"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 
<Style TargetType="TextBlock"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}" Value="Red"> 
      <Setter Property="Foreground" Value="White"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}" Value="Green"> 
      <Setter Property="Foreground" Value="White"/> 
     </DataTrigger> 
    </Style.Triggers> 
    <Setter Property="FontWeight" Value="Bold"/> 
</Style> 

因此,如果CellStyle设置ControlTemplate属性需要通过TemplateBinding挂接。例如

<DataGrid.CellStyle> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGridCell}"> 
        <Grid Background="{TemplateBinding Background}"> 
         <ContentPresenter /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Background" Value="LightGreen"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Content}" Value="Apple"> 
       <Setter Property="Background" Value="Red"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Content}" Value="Tomato"> 
       <Setter Property="Background" Value="Green"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

不要做模板内的触发,否则会变得混乱。

+0

谢谢你的有用链接!第一个问题因为你而解决:)关于第二个问题,这是一个为TextBlock定义的样式,所以我真的应该使用TextElement.Foreground吗?我正在编辑这个问题,因为我发现可能是什么原因 - 这可能会带来一个新问题,甚至更棘手:/ – Damascus

+0

@Damascus:事实上,起初没有父母不应该是有问题的。我仍然没有得到**你在哪里使用这种风格,以及它如何与其他组件交互,但是你的问题需要更多的上下文。 –

+0

Woops,不好意思,只是更新了这个问题,风格被用作'DataGridTextColumn.ElementStyle',检查了这个:) – Damascus