2015-02-24 8 views
5

Sto provando a cambiare il colore evidenziato (selezionato) e il colore del testo evidenziato di una casella di riepilogo wpf in fase di esecuzione. Ho provato a creare uno stile e applicarlo come segue:Cambiare la casella di riepilogo WPF Selezionate il colore del testo e l'evidenziazione/sfondo Colore usando C#

Style s = new Style(typeof(ListBox)); 
    s.Resources.Add(SystemColors.HighlightBrushKey, Setting.ListSelectedColor); 
    s.Resources.Add(SystemColors.HighlightTextBrushKey, Setting.ListSelectedTextColor); 
    lstGames.Style = s; 

Ma questo sembra non fare nulla. C'è un modo per raggiungere questo obiettivo?

EDIT:

Per suggerimenti, ho provato con DynamicResources per raggiungere questo obiettivo, ma finora questo non ha avuto successo neanche. Il mio codice per questo:

DYNAMICRESOURCES

<UserControl.Resources> 
    <Color x:Key="ListTextSelectedColor"/> 
    <Color x:Key="ListSelectedColor"/> 
</UserControl.Resources> 

LISTBOX

 <ListBox ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" 
      Name="lstGames" Margin="20" Grid.Row="2" Grid.Column="2" 
      SelectionChanged="lstGames_SelectionChanged" Grid.RowSpan="2" Grid.ColumnSpan="2" 
      Background="{x:Null}" BorderBrush="{x:Null}" SelectionMode="Single" 
      FontSize="18" FontFamily="OCR A Extended"> 
     <Style TargetType="ListBox"> 
      <Style.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{DynamicResource ListSelectedColor}"/> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{DynamicResource ListSelectedColor}"/> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="{DynamicResource ListTextSelectedColor}"/> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="{DynamicResource ListTextSelectedColor}"/> 
      </Style.Resources> 
     </Style> 
    </ListBox> 

l'applicazione di risorse in C#

this.Resources["ListSelectedColor"] = SETING.ListSelectedColor.Color; 
this.Resources["ListTextSelectedColor"] = SETTING.ListSelectedTextColor.Color; 
+1

Penso che si stia cercando il collegamento xaml a DynamicResource. Fare riferimento a questa domanda SO per un esempio. http://stackoverflow.com/q/17502467/1862333 – failedprogramming

+0

@failedprogramming Ho provato a utilizzare DynamicResources per raggiungere questo obiettivo, ma non ho avuto alcun successo. Ho aggiornato il mio post originale con il mio tentativo. – downeysyndrome

+0

@failedprogramming La tua risposta combinata con mi ha creato e funzionante splendidamente. Aggiungerò una risposta con la mia risoluzione finale per gli altri. – downeysyndrome

risposta

20

Soluzione:

<Window x:Class="ListBoxStyle.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:src="clr-namespace:ListBoxStyle" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style x:Key="_ListBoxItemStyle" TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Border Name="_Border" 
           Padding="2" 
           SnapsToDevicePixels="true"> 
          <ContentPresenter /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="true"> 
           <Setter TargetName="_Border" Property="Background" Value="Yellow"/> 
           <Setter Property="Foreground" Value="Red"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <ListBox ItemContainerStyle="{DynamicResource _ListBoxItemStyle}" 
       Width="200" Height="250" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       ScrollViewer.HorizontalScrollBarVisibility="Auto"> 
      <ListBoxItem>Hello</ListBoxItem> 
      <ListBoxItem>Hi</ListBoxItem> 
     </ListBox> 
    </Grid> 
</Window> 
+0

grazie per questo, ma mi rendo conto che in realtà non voglio impostare le proprietà Background e foreground, ma HighlightBrushKey e HighlightBrushTextKey. Le risorse dinamiche non sembrano essere applicabili in entrambi i modi. C'è un metodo in cui dovrei cambiarli? – downeysyndrome

+0

Questo ha funzionato magnificamente dopo un piccolo sartiame. Ho usato le mie attuali risorse dinamiche come valori per i Setter Trigger, e dopo ha funzionato magnificamente. Grazie mille! – downeysyndrome

7

Grazie a Vinkal e alla programmazione fallita, ho trovato tutto funzionante. Ho creato le seguenti risorse:

<UserControl.Resources> 
     <SolidColorBrush x:Key="ListTextSelectedColor" x:Shared="False"/> 
     <SolidColorBrush x:Key="ListSelectedColor" x:Shared="False"/> 
     <Style x:Key="_ListBoxItemStyle" TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Border Name="_Border" 
           Padding="2" 
           SnapsToDevicePixels="true"> 
          <ContentPresenter /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="true"> 
           <Setter TargetName="_Border" Property="Background" Value="{DynamicResource ResourceKey=ListSelectedColor}"/> 
           <Setter Property="Foreground" Value="{DynamicResource ResourceKey=ListTextSelectedColor}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 

e poi applicato lo stile alla mia casella di riepilogo con:

ItemContainerStyle="{DynamicResource ResourceKey=_ListBoxItemStyle}" 

E, infine, cambiare le risorse SolidColorBrush (quindi modificando i valori setter) nel mio codice C# da fare il seguente:

this.Resources["ListSelectedColor"] = EmulatorPage.ListSelectedColor; 
    this.Resources["ListTextSelectedColor"] = EmulatorPage.ListSelectedTextColor; 

Grazie a tutti e due!

0

Per tutti i neigh-sayers là fuori ... non perdere la speranza! può essere fatto!

Ho iniziato con VSS facendo clic destro sulla casella di riepilogo e utilizzato ogni "Modifica modello" e "Modifica modelli aggiuntivi" per ciascuna cosa disponibile fino a quando ho trovato il modo in cui funzionano queste cose.

Si inizia abbastanza semplicemente con una casella di riepilogo, associata a MVVM normalmente.

<ListBox Width="100" 
    x:Name="myComboBox" Margin="8" 
    ItemsSource="{Binding ListBoxListSource}" 
    SelectedIndex="{Binding ListBox}"> 
</ListBox> 

In UserControl o la finestra Risorse istituito alcune cose ....

ListBoxStyle - questo stili il contenitore principale della casella di riepilogo, è possibile impostare i bordi, margini, padding ecc della scatola principale qui. Per il mio esempio mi sto solo sbarazzando di tutto per de-allinearlo.

<UserControl.Resources> 
    <Style x:Key="ListBoxStyle" TargetType="{x:Type ListBox}"> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="Foreground" Value="Transparent"/> 
     <Setter Property="BorderBrush" Value="Transparent"/> 
     <Setter Property="BorderThickness" Value="0"/> 
     <Setter Property="Padding" Value="0"/> 
     <Setter Property="Margin" Value="0"/> 
    </Style> 
</UserControl.Resources> 

ItemContainerStyle - Questo è il bit che la gente dice non può essere ri-styled - contiene il bar "windows-selettore-blu" quando si seleziona un elemento, ma la paura non è anche questo può essere re-designato (unire questa sezione UserControl.Resources in combinazione con quella sopra).

Questa sezione è> cambiare il modello di ItemContainer da qualunque cosa si tratti di un bordo, impostando un margine superiore di 3 per riempire le cose e impostare uno stile. Tutto quello che stiamo facendo con questo stile è l'aggiunta del bordo trasparente 3px a sinistra ea destra dell'elemento. Quindi in Triggers> IsSelected (target di myBorder), cambiando il bordo Brush in Red.

<UserControl.Resources> 
    <Style x:Key="ItemContainerStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border x:Name="myBorder" 
            Padding="0" Margin="0 3 0 0" 
            SnapsToDevicePixels="true" 
            Style="{DynamicResource borderContent}"> 
         <ContentPresenter /> 
        </Border> 
        <ControlTemplate.Resources> 
         <Style x:Key="borderContent" TargetType="Border"> 
          <Setter Property="BorderThickness" Value="3 0 3 0"/> 
          <Setter Property="BorderBrush" Value="Transparent"/> 
         </Style> 
        </ControlTemplate.Resources> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter TargetName="myBorder" Property="BorderBrush" Value="Red"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

ListBoxItemDataTemplate - Il prossimo passo è quello di rendere il contenitore elemento che consente di visualizzare i dati. Nel mio esempio, YourTextBlockStyler ha un trigger sull'associazione Testo> e cambia i colori di primo piano e di sfondo del testo. Prendi nota che il primo piano e lo sfondo dello stile Listbox sono impostati su trasparente, quindi devi cavalcarli nel tuo stile TextBlock se vuoi vedere qualcosa.

<UserControl.Resources> 
    <DataTemplate x:Key="ListBoxItemDataTemplate"> 
     <TextBlock Text="{Binding}" Style="{StaticResource YourTextBlockStyler}"/> 
    </DataTemplate> 
</UserControl.Resources> 

Torna alla casella di riepilogo - Ora abbiamo impostato tutti gli stili e modelli nella sezione Risorse possiamo aggiornare la casella di riepilogo con style = "" ItemContainerStyle = "" e ItemTemplate = ""

<ListBox Width="100" 
    x:Name="myComboBox" Margin="8" 
    ItemsSource="{Binding ListBoxListSource}" 
    SelectedIndex="{Binding ListBox}" 
    Style="{StaticResource ListBoxStyle}" 
    ItemContainerStyle="{StaticResource ItemContainerStyle}" 
    ItemTemplate="{StaticResource ListBoxItemDataTemplate}"> 
</ListBox> 

Allora la tua casella di riepilogo noioso si trasformerà magicamente in una casella di riepilogo del tutto rinnovato con selettore bordo rosso

da Boring standard list box in Totally restyled list box with red border selector

0.123.

Tutti senza modificare un singolo System.ResourceBrush =]

Problemi correlati