2011-08-17 19 views
5

Jak widziałem, wiele osób borykało się z tym problemem, ale nie mogę zrozumieć, dlaczego moja sprawa nie działa i zaczyna mnie to doprowadzać do szału.Stylizacja obiektu Textblock utworzonego w programie ContentPresenter

Kontekst: Mam DataGrid, który ma być barwiony zgodnie z wartościami każdej komórki. W związku z tym mam styl dynamiczny rozwiązujący rzeczywisty szablon, który ma być używany dla każdej komórki. Tła działają teraz odpowiednio.

Nowy problem: gdy mam ciemne tło, chcę, aby kolor czcionki był biały, a grubość czcionki była pogrubiona, aby tekst był poprawnie czytelny. I ... Nie potrafię tego poprawnie zaprojektować.

Czytałem kilka StackOverflow posty o tym:

This one fits my problem but doesn't provide me any working solution This one is also clear and detail but... duh This is almost the same problem as me but... Solution does not work

Oto, co starałem dotąd:

<!-- Green template--> 
    <ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}"> 
     <Grid Background="Green"> 
      <ContentPresenter 
          HorizontalAlignment="Center" 
             VerticalAlignment="Center"> 
       <ContentPresenter.Resources> 
        <Style BasedOn="{StaticResource BoldCellStyle}" TargetType="{x:Type TextBlock}" /> 
       </ContentPresenter.Resources> 
      </ContentPresenter> 
     </Grid> 
    </ControlTemplate> 

nie działa. Tło jest zielone, ale tekst pozostaje czarny i nie jest pogrubiony.

BTW, BoldCellStyle jest tak proste, jak to tylko możliwe:

<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}"> 
    <Setter Property="FontWeight" Value="Bold"/> 
    <Setter Property="Foreground" Value="White" /> 
</Style> 

Ok. Druga próba (która jest prawdziwym głupi jeden, ale dobrze ...)

<!-- Green template --> 
    <ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}"> 
     <Grid Background="Green"> 
      <ContentPresenter 
          HorizontalAlignment="Center" 
             VerticalAlignment="Center"> 
       <ContentPresenter.Resources> 
        <Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}"> 
         <Setter Property="FontWeight" Value="Bold"/> 
         <Setter Property="Foreground" Value="White" /> 
        </Style> 

       </ContentPresenter.Resources> 
      </ContentPresenter> 
     </Grid> 
    </ControlTemplate> 

nie działa albo.

Następnie Próbowałem grać z właściwościom ContentPresenter „s:

<!-- Green template --> 
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}"> 
    <Grid Background="Green"> 
     <ContentPresenter TextElement.FontWeight="Bold" TextElement.Foreground="White" TextBlock.Foreground="White" 
         HorizontalAlignment="Center" 
            VerticalAlignment="Center" /> 
    </Grid> 
</ControlTemplate> 

I ... Jak można się spodziewać, to nawet nie działa.

Zaintrygowany, użyłem Snoop do przeglądania wszystkich składników mojego interfejsu. W pierwszych dwóch przypadkach Snoop pokazuje mi, że każda komórka to Grid z ContentPresenter zawierającą TextBlock i rzeczywistą Style, ale ... Właściwości TextBlock nie mają zastosowania, a FontWeight jest nadal normalny.

Ostatni przypadek, jeszcze bardziej szokujące, widzę, że Snoop pokazuje mi, że faktycznie mamy ContentPresenter z odpowiednimi właściwościami (tj TextElement.FontWeight="Bold"), ale wygenerowany automatycznie TextBlock mocy jest - jeszcze - nie stylem.

Nie mogę dostać tego, czego tu brakuje. Próbowałem, jak widać, prawie wszystko, co mogłem zrobić tutaj, i TextBlock s nadal nie są sformatowane.

Masz pomysł? Dzięki jeszcze raz!

Odpowiedz

2

DataGridColumns że wywodzą się z DataGridBoundColumn (wszystkie z wyjątkiem DataGridTemplateColumn) ma właściwość ElementStyle, która jest stosowana do TextBlock gdy jest on tworzony. Dla np.DataGridTextColumn Wygląda to

static DataGridTextColumn() 
{ 
    ElementStyleProperty.OverrideMetadata(typeof(DataGridTextColumn), 
     new FrameworkPropertyMetadata(DefaultElementStyle)); 
    // ... 
} 

To zastępuje metadane ElementStyle i stanowi nową wartość domyślną, DefaultElementStyle, który w zasadzie tylko ustawia margines domyślną TextBlock.

public static Style DefaultElementStyle 
{ 
    get 
    { 
     if (_defaultElementStyle == null) 
     { 
      Style style = new Style(typeof(TextBlock)); 
      // Use the same margin used on the TextBox to provide space for the caret 
      style.Setters.Add(new Setter(TextBlock.MarginProperty, new Thickness(2.0, 0.0, 2.0, 0.0))); 
      style.Seal(); 
      _defaultElementStyle = style; 
     } 
     return _defaultElementStyle; 
    } 
} 

Ten styl jest ustawiony w kodzie każdym nowym DataGridCell jest tworzony z element.Style = style; i to jest przesłanianie stylu próbujesz ustawić, nawet jeśli starają się ustawić go w sposób dorozumiany.

O ile mi wiadomo, trzeba będzie powtórzyć to dla kolumn

<DataGridTextColumn Header="Column 1" ElementStyle="{StaticResource BoldCellStyle}" .../> 
<DataGridTextColumn Header="Column 2" ElementStyle="{StaticResource BoldCellStyle}" .../> 
+0

Wow. Czy jestem do tego absolutnie zmuszony? Głównym celem mojej pracy jest stylizacja każdej komórki osobno (niektóre z nich są odważne, inne są normalne). – Damascus

+0

@Damaszek: Tak, o ile wiem. Nadal możesz używać tego samego stylu, musisz tylko zastosować go do każdej kolumny. –

+0

Próbowałem go i to "działa" (tak, ustawia wszystkie moje komórki na pogrubione), spróbuję grać z wyzwalaczami, aby to zrobić:/ – Damascus

Powiązane problemy