2008-12-23 17 views
8

Ok en mi ListBox desplazamiento de imágenes w/texto, etc. la saga continúa. Cuando hago clic en uno de los elementos, para seleccionarlo, se ejecuta un proceso para abrir un navegador web y acceder a una URL específica. El problema que estoy teniendo ahora es que cuando la aplicación WPF pierde el foco y se abre el navegador web, el elemento que se hace clic dentro del cuadro de lista se vuelve blanco. Aquí está todo el ListBox XAML. He configurado los elementos seleccionados para que sean transparentes, ¿esto tiene algo que ver con la pérdida de enfoque de la aplicación WPF?WPF ListBox Imagen seleccionada la saga continúa

¿Hay algo que pueda agregar el código que ejecuta el proceso para abrir el navegador web y volver a establecer el foco en la aplicación WPF?

Gracias.

<ListBox ItemsSource="{Binding Source={StaticResource WPFApparelCollection}}" Margin="61,-8,68,-18" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden" SelectionMode="Single" x:Name="list1" MouseLeave="List1_MouseLeave" MouseMove="List1_MouseMove" Style="{DynamicResource ListBoxStyle1}" Background="Transparent" BorderThickness="0"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Background" Value="Transparent" /> 
       <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" /> 
       <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" /> 
       <Setter Property="Padding" Value="20,10,20,10" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
          <Border x:Name="Bd" SnapsToDevicePixels="true" Background="Transparent" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> 
           <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
          </Border> 
          <ControlTemplate.Triggers> 
           <Trigger Property="IsSelected" Value="true"> 
            <Setter Property="Background" TargetName="Bd" Value="Transparent" /> 
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" /> 
           </Trigger> 
           <MultiTrigger> 
            <MultiTrigger.Conditions> 
             <Condition Property="IsSelected" Value="true" /> 
             <Condition Property="Selector.IsSelectionActive" Value="false" /> 
            </MultiTrigger.Conditions> 
            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> 
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> 
           </MultiTrigger> 
           <Trigger Property="IsEnabled" Value="false"> 
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListBox.ItemContainerStyle> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel Orientation="Horizontal" IsItemsHost="True" /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <Grid> 
         <Image Source="{Binding Image}" MouseLeave="Image_MouseLeave" MouseEnter="Image_MouseEnter" Cursor="Hand" Tag="{Binding Link}" MouseLeftButtonDown="Image_MouseLeftButtonDown" VerticalAlignment="Top" HorizontalAlignment="Left"></Image> 
        </Grid> 
        <Label Content="{Binding Name}" Cursor="Hand" Tag="{Binding Link}" MouseLeftButtonDown="Label_MouseLeftButtonDown" VerticalAlignment="Bottom" Foreground="White" Style="{StaticResource Gotham-Medium}" FontSize="8pt" HorizontalAlignment="Center" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Respuesta

36

Un truco que he encontrado al jugar con los colores de selección en un cuadro de lista es trabajar con los cepillos del sistema en lugar de luchar contra ellos.

Cuando se enfoca un ListBox y se selecciona un elemento, el fondo de ese elemento es SystemColors.HighlightBrush. Cuando el ListBox pierde el foco, sin embargo, el fondo del elemento seleccionado se convierte en SystemColors.ControlBrush.

Sabiendo esto, puede anular las escobillas del sistema para esa ListBox para que los elementos queden pintados con los colores que desee.

<ListBox> 
    <ListBox.Resources> 
     <!-- override the system brushes so that selected items are transparent 
      whether the ListBox has focus or not --> 
     <SolidColorBrush 
      x:Key="{x:Static SystemColors.HighlightBrushKey}" 
      Color="Transparent" /> 
     <SolidColorBrush 
      x:Key="{x:Static SystemColors.ControlBrushKey}" 
      Color="Transparent" /> 
     <SolidColorBrush 
      x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
      Color="Black" /> 
    </ListBox.Resources> 
    <!-- ... your items here ... --> 
</ListBox> 
+0

Wow ... you da man. Muy buena idea aquí. Tengo que empezar a pensar en WPFish, y no en Webform/Winform. Gracias de nuevo. John –

+0

Pero si tiene un menú contextual en su ListBox, los elementos en ContextMenu no tendrán el resaltado, ¿verdad? ¿Cómo puedo lograr ambos comportamientos? – jpsstavares

+0

@jpsstavares Sí, ContextMenus no son técnicamente parte del mismo árbol visual que su propietario, por lo que los pinceles no se heredarán. Probablemente tendrías que duplicarlos en los recursos de ContextMenu, aunque no lo he intentado. –