2015-02-24 21 views
5

Próbuję zmienić kolor podświetlonego (wybranego) i podświetlony kolor pola listy wpf w środowisku wykonawczym. Próbowałem stworzyć styl i zastosować go w następujący sposób:Zmiana koloru pola WPF Wybrane pole tekstowe koloru i podświetlenia/tła Kolor przy użyciu C#

Ale to nic nie robi. Czy jest jakiś sposób, aby to osiągnąć?

EDIT:

za sugestie, próbowałem za pomocą DynamicResources do osiągnięcia tego celu, ale do tej pory nie udało albo. Mój kod to:

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> 

STOSOWANIE zasobów w C#

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

Myślę, że szukasz wiązania xaml do DynamicResource. Zobacz przykładowe pytanie dotyczące SO. http://stackoverflow.com/q/17502467/1862333 – failedprogramming

+0

@failedprogramming Próbowałem użyć DynamicResources, aby to osiągnąć, ale nie osiągnęliśmy żadnego sukcesu. Zaktualizowałem mój oryginalny wpis moją próbą. – downeysyndrome

+0

@failedprogramming Twoja odpowiedź połączyła się, dzięki czemu mogłeś się pięknie przygotować. Dodam odpowiedź z moją ostateczną rezolucją dla innych. – downeysyndrome

Odpowiedz

20

Rozwiązanie:

<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

dziękuję za to, ale zdaję sobie sprawę, że tak naprawdę nie chcę ustawiać właściwości tła i pierwszego planu, ale HighlightBrushKey i HighlightBrushTextKey. Zasoby dynamiczne nie wydają się stosować w żaden sposób. Czy istnieje pewna metoda, w której powinienem je zmieniać? – downeysyndrome

+0

To działało pięknie po niewielkim osprzęcie. Użyłem moich aktualnych zasobów dynamicznych jako wartości dla ustawiaczy wyzwalaczy, a następnie zadziałało pięknie. Dziękuję bardzo! – downeysyndrome

7

Dzięki programowi Vinkal i programowaniu zakończonemu błędami wszystko działało pięknie. Stworzyłem następujących zasobów:

<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> 

A potem zastosować styl do mojego listbox z:

ItemContainerStyle="{DynamicResource ResourceKey=_ListBoxItemStyle}" 

I wreszcie, zmień zasoby solidcolorbrush (a więc zmianę wartości setter) w moim kodu C#, wykonując następujące:

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

Dziękuję wam obojgu!

0

Do wszystkich sąsiadów ... nie traćcie nadziei! można to zrobić!

Zacząłem od VSS, klikając prawym przyciskiem myszy na liście i używając każdego "Edytuj szablon" i "Edytuj dodatkowe szablony" dla każdej dostępnej rzeczy, aż znalazłem, jak działają te rzeczy.

Zaczynasz po prostu od skrzynki z listą, przywiązanej do MVVM jak zwykle.

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

W UserControl lub okno Resources skonfigurować kilka rzeczy ....

ListBoxStyle - tym style główny pojemnik z pola listy, można ustawić granice, marginesy, dopełnienie etc główne pole tutaj. Na mój przykład po prostu pozbywam się wszystkiego, żeby to zmienić.

<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 - To jest trochę, że ludzie mówią, nie może być ponownie stylizowany - zawiera pasek „windows-selektora-blue”, gdy element jest zaznaczony, ale nie bój się to też może być zmienić styl (połączyć sekcję UserControl.Resources w połączeniu z powyższym).

Ta sekcja jest> zmiana szablonu elementu ItemContainer z dowolnego elementu na obramowanie, ustawienie górnego marginesu 3 w celu uzupełnienia i ustawienia stylu. Wszystko, co robimy w tym stylu, dodaje przezroczyste obramowanie 3 pikseli po lewej i prawej stronie elementu. Następnie w wyzwalaczach> IsSelected (target of myBorder), zmieniając obramowanie Brush to 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 - Następnym krokiem jest, aby pojemnik na artykuł, który wyświetla dane. W moim przykładzie YourTextBlockStyler ma wyzwalacz wiązania Text> i zmienia kolory pierwszego planu i tła tekstu. Zwróć uwagę, że pierwszy plan i tło stylu Listbox są ustawione jako przezroczyste, więc musisz je przejechać w stylu TextBlock, jeśli chcesz coś zobaczyć.

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

Powrót do listbox - Teraz mamy utworzone wszystkie style i szablony w sekcji Zasoby możemy zaktualizować listbox z style = „” ItemContainerStyle = „” i 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> 

Wtedy twoje nudne pole listy przemieni w magiczny sposób do listy całkowicie restyled z czerwonego przełącznika granicznego

Od Boring standard list box do Totally restyled list box with red border selector

Wszystko bez edycji pojedynczego System.ResourceBrush =]