2011-07-11 19 views
6

¿Alguien podría sugerir cómo puedo implementar un WPF ListBox que (de hecho) tiene un fondo transparente/prueba de impacto invisible, pero cuyos elementos todavía son hit-test-visible?WPF ListBox transparente con elementos seleccionables

En otras palabras, me gustaría poder hacer clic, a través del fondo del ListBox, en los controles debajo de él, pero aún así poder seleccionar los elementos de ListBox.

Tengo ListBox usando un panel de diseño personalizado (es un ListBox porque los elementos deben ser seleccionables). Sin embargo, necesito que este panel se superponga sobre otros controles, lo que permite que sigan utilizándose normalmente.

que he probado varias combinaciones de Background="Transparent" y IsHitTestVisible="False" pero sospechan que podría estar en la línea equivocada ...

la esperanza que esto tiene sentido - Soy nuevo en WPF por lo que cualquier orientación será muy apreciada! Gracias.

Respuesta

7

Pruebe a establecer el fondo a "{x: Null}.. En la ListeItemContainer y el propio cuadro de lista

transparente sigue siendo afectada comprobable, es por eso que todavía está recibiendo pruebas de golpe en él

EDITAR

me encontré con WPF Inspector en una muestra y se encontró que la ScrollViewer en la plantilla de cuadro de lista por defecto estaba causando clics del ratón para permanecer en el cuadro de lista.

Aquí está una plantilla de control ListBox que no incluye el ScrollViewer. Permite que el mouse pase al TextBox que está detrás del cuadro de lista, pero aún le permite al usuario seleccionar elementos en el cuadro de lista.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    > 
    <Window.Resources> 
     <SolidColorBrush x:Key="ListBorder" Color="#828790"/> 
     <Style x:Key="ListBoxStyle1" TargetType="{x:Type ListBox}"> 
      <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/> 
      <Setter Property="BorderBrush" Value="{StaticResource ListBorder}"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
      <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
      <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
      <Setter Property="Stylus.IsFlicksEnabled" Value="False"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBox}"> 
         <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true"> 
          <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
          </Trigger> 
          <Trigger Property="IsGrouping" Value="true"> 
           <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid Width="100"> 
    <TextBox TextWrapping="Wrap">I'm in the background. I'm in the background. I'm in the backgroun.</TextBox> 
    <ListBox Background="{x:Null}" Style="{StaticResource ListBoxStyle1}"> 
     <ListBoxItem Margin="10" Background="#999">Hello</ListBoxItem> 
     <ListBoxItem Margin="10" Background="#999">Hello</ListBoxItem> 
     <ListBoxItem Margin="10" Background="#999">Hello</ListBoxItem> 
     <ListBoxItem Margin="10" Background="#999">Hello</ListBoxItem> 
    </ListBox> 
    </Grid> 
</Window> 
+0

Gracias @Nathan - Lo intenté, pero parece que tampoco funciona. Nada debajo se puede hacer clic a menos que establezca 'IsHitTestVisible =" False "', pero por supuesto eso significa que los elementos no se pueden seleccionar ... – FuzzyLogic

+0

Intente utilizar una herramienta como Christian Moser's WPF Inspector (http://www.wpftutorial.net/inspector .html) para ver qué capas/controles están siendo renderizados por el ListBox. Esto debería ayudarlo a ubicar la capa que necesita tener un fondo nulo. – NathanAW

+0

Intenté esto con WPF Inspector y encontré que ScrollViewer en el ListBox era el problema. Arriba hay una muestra que elimina el ScrollViewer de la plantilla ListBox. Parece funcionar como preguntaste. – NathanAW

Cuestiones relacionadas