2017-06-13 6 views
-1

Ich habe eine wpf app, C#, die Texte anzeigt (teahcer Name), wenn eine Combobox geschlossen wird. Grundsätzlich ist es in 1 String enthalten und wird an die classInstance.TeachersComboBoxText oder Text="{Binding Path=TeachersComboBoxText}" übergeben. Alles ist großartig, aber der Kunde bittet darum, dass der Text kursiv ist, wenn der Lehrer als Standard oder als Zweitlehrer gekennzeichnet ist. Grundsätzlich muss ich eine Zeichenkette haben, aber unterschiedliche Schriftstile werden darauf angewendet, hängt von meinen Daten ab.Wie man verschiedene Schriftstile in einer Zeichenkette anwendet

<ComboBox Name="instanceTeachersComboBox" 
     IsEditable="True" 
     IsReadOnly="True" 
     ItemsSource="{Binding Path=TeacherList}" DropDownClosed="teachersComboBox_DropDownClosed" 
     Text="{Binding Path=TeachersComboBoxText}" 
     FontWeight="{Binding Path=IsSelectedFontWeight}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding Path=IsSelected}" 
         Background="{Binding Path=IsActiveColour}" 
         Content="{Binding Path=Display}" 
         Foreground="{Binding Path=IsClashColour}" 
         FontStyle="{Binding Path=EndDateFontStyle}"/> 
       <Image Source="/SchoolEdgeTimetable;component/Images/greentick16x16.png" 
         Margin="5,0,0,0" 
         Visibility="{Binding Path=IsSpecialitySubjectVisibility}"></Image> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

=== Dies ist der Code ====

if (classInstance.TeacherList.Any(c => c.IsSelected == true && c.IsDefault == false) || instanceCount != defaultCount) 
{ 
    System.Windows.Forms.RichTextBox rtf = new System.Windows.Forms.RichTextBox(); 
    foreach (var item in data) 
    { 
     if (!item.IsDefault) 
     { 
      rtf.SelectionFont = new Font("Arial", 12, System.Drawing.FontStyle.Italic); 
      rtf.AppendText(item.Display); 
     }   
     text = GT.Join2Strings(text, item.IsDefault? item.Display : rtf.Text, "\n"); 
    } 
} 
else 
    text = DEFAULT_TEXT; 
classInstance.TeachersComboBoxText = text; 

ich rtf versucht, weil es scheint, dass ich es nicht in einfachen String anwenden kann, aber der Code funktioniert nicht. Gibt es eine Möglichkeit, dies ohne RTF zu lösen? oder wenn nicht, warum funktioniert mein Code nicht? Jeder kann einen besseren Weg vorschlagen, dies zu tun, wird geschätzt. Danke

UPDATE: Leute schlagen vor, die Schablone zu ändern, die ich bereits tat, das Arbeit groß ist, wenn es die Einzelteile zeigt, wenn eine combobox geöffnet ist. Einer meiner Artikel ist ROT und kursiv, wie Sie sehen können ABER Was ich versuche zu tun, ist jedoch Anzeige der Combobox TEXT-Eigenschaft zu ändern. Ich habe ein Bild angehängt, um besser zu verstehen, was ich meine. dank enter image description here

Antwort

-1

einen Datatrigger hinzufügen, die Ihre Schriftart Italic ändert:

<DataTrigger Binding="{Binding IsDefault}" Value="1"> 
    <Setter Property="FontStyle" Value="Italic"/> 
</DataTrigger> 
+0

aber der Name des Lehrers angehängt werden zusammen in nur eine Zeichenfolge. Bitte sehen Sie meinen Code. Also wird der IsDefault-Trigger nicht mehr funktionieren. Dies ist ein Text und keine Instanz oder ein Objekt. Danke, – user742102

0

Es ist ziemlich einfach, wenn Sie wissen, wie <Run> Tag von TextBlock- Steuerung in Code hinter sich zu nutzen. Im folgenden sehen Sie den Code ein:

//loop through all the teachers 
foreach (var teacher in vm.Teachers) 
{ 
    //check if teacher is default 
    if (teacher.IsDefault) 
     { 
      //add text to "tb" textblock, in italic style 
      tb.Inlines.Add(new Run(teacher.Name) { FontStyle = FontStyles.Italic }); 
     } 
    else 
     { 
      //add text to "tb" textblock 
      tb.Inlines.Add(new Run(teacher.Name)); 
     } 
} 

Wenn Sie daran interessiert sind mehr über Inline-Formatierung zu wissen, ist here ein cooler Blog-Beitrag für gleiche. Lassen Sie es mich wissen, wenn Sie weitere Hilfe benötigen.

+0

Hallo, ich habe schon etwas über Inline gesehen, aber ich bin mir nicht sicher, ob ich es in einer Combobox verwenden kann? Wenn Sie sehen können, binde ich die Zeichenfolge (Name des ausgewählten Lehrers - Lehrer) an die Text-Eigenschaft einer Combobox und nicht an einen Textblock. Ich hätte eine Vorlage hinzugefügt, die einen Textblock hat, aber wie? Wie kann ich sagen, dass die Vorlage nur anwendbar ist, wenn die Combobox geschlossen ist und der Text erscheint? Wenn es geöffnet ist, zeigt es die üblichen Elemente in einer Combobox an. Wenn es geschlossen ist, wird der Anzeigetext aller ausgewählten Lehrer angezeigt. danke – user742102

+0

Ja, genau das musst du tun. Sie müssen den Vorlagenselektor verwenden, um zu entscheiden, welche Vorlage zur Laufzeit angezeigt werden soll. Dieser Link wird Ihnen dabei helfen. https://stackoverflow.com/questions/4672867/cani-i-use-a-different-template-for-the-selected-item-in-a-wpf-combobox-than-for Versuchen Sie die Lösung in diesem Link und lass mich über deinen Fortschritt Bescheid wissen. –

+0

Ich habe meine Frage aktualisiert. Wenn Sie Zeit haben, es sich anzusehen, fühlen Sie sich frei. danke – user742102

0

Sie konnten die Loaded Ereignis für die CheckBox im ItemTemplate Griff und setzen Sie seine Content Eigenschaft auf eine TextBlock von Inline Elemente, zB:

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <CheckBox IsChecked="{Binding Path=IsSelected}" 
         Background="{Binding Path=IsActiveColour}" 
         Foreground="{Binding Path=IsClashColour}" 
         FontStyle="{Binding Path=EndDateFontStyle}" 
         Loaded="CheckBox_Loaded"> 
      </CheckBox> 
      <Image Source="/SchoolEdgeTimetable;component/Images/greentick16x16.png" 
         Margin="5,0,0,0" 
         Visibility="{Binding Path=IsSpecialitySubjectVisibility}"></Image> 
     </StackPanel> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

private void CheckBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    CheckBox checkBox = sender as CheckBox; 
    dynamic dataObject = checkBox.DataContext; 
    string display = dataObject.Display; 
    TextBlock textBlock = new TextBlock(); 
    //split the display string and add Inlines to the TextBlock as suggested by @Naresh Ravlani here... 
    checkBox.Content = textBlock; 
} 
+0

Ich habe es versucht, es fügt einen Inline-Textblock während Combobox geöffnet ist, nicht während geschlossen, so ist dies nicht die Antwort. Vielen Dank. – user742102

+0

Was meinst du mit "nicht während geschlossen"? Geht es nicht nur darum, ein anderes Event wie zum Beispiel das DropDownClosed Event zu bearbeiten? Kreatives Denken ist der beste Freund eines Entwicklers ... – mm8

+0

Der combobx Text wird angezeigt, wenn er geschlossen ist, während er beim Öffnen geöffnet wird. Die Elemente werden angezeigt. Ich habe ein Ereignis, bei dem das Dropdown-Menü aufgerufen wird. Dort setze ich den Text fest, indem ich den gesamten Anzeigetext des ausgewählten Elements verknüpfe. Wie auch immer, vergiss nicht, ich habe nur vorgeschlagen, einfach einen Präfix in den Namen jedes Lehrers hinzuzufügen, denn es scheint unmöglich, eine Vorlage für Text zu ändern. Danke an alle, die versucht haben zu antworten. – user742102

Verwandte Themen