2011-08-18 68 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