2010-10-18 19 views
5

¿Hay alguna posibilidad de que pueda colocar una ventana emergente al lado de un elemento de ListBox? Uso MVVM, la lista está vinculada a elementos, y para algunos elementos elegidos quiero mostrar ventana emergente al lado del elemento.Colocación de Wpf Popup

Tengo una lista de elementos y quiero mostrar una ventana emergente cuando hago clic en el elemento de lista especificado, pero la ventana emergente debe aparecer junto al elemento de la lista seleccionada.

que hemos probado algo como esto (que no funciona):

<Popup IsOpen="{Binding Path=ShowPopup}" PlacementTarget="{Binding ElementName=List1, Path=SelectedItem}" Placement="Center"> 
     <TextBox Background="Red" Height="120" Text="Aaaaaa FUUUUUUUUUUUUU....."></TextBox> 
    </Popup> 

no quiero usar código subyacente, sólo se xaml

Respuesta

1

Puesto que usted quiere mostrar la ventana emergente cuando el artículo se hace clic, es que esto funciona para usted:

<Popup IsOpen="{Binding Path=ShowPopup}" Placement="Mouse"> 
    <TextBox Background="Red" Height="120" Text="Aaaaaa FUUUUUUUUUUUUU....."></TextBox> 
</Popup> 
2

la razón por la que su ejemplo no funciona es simplemente porque va a enlazar la orientación de la ubicación de un objeto no-ui.

PlacementTarget="{Binding ElementName=List1, Path=SelectedItem}" 

SelectedItem en este caso podría ser un modelo a modelo/vista que representa un elemento de la lista, para ello no es un uso correcto de la propiedad PlacementTarget.

Lo que necesita es establecer PlacementTarget en el ItemContainer (Dr. WPF explains) y esto no es posible sin la ayuda de "algunos" códigos.

Ahora que conoce el problema, hay algunas maneras de hacer que su código funcione, así que lo dejo en sus manos.

6

Esto colocará una ventana emergente a la derecha de la Ejemplo

<Window.Resources> 
    <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" /> 
    <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" /> 

    <ControlTemplate x:Key="PopupListBoxItemTemplate" TargetType="ListBoxItem"> 
     <Border Name="Border" Padding="2" SnapsToDevicePixels="true"> 
      <Grid> 
       <Popup Name="c_popup" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" > 
        <Border BorderBrush="Black" BorderThickness="1" CornerRadius="2.5"> 
         <TextBlock Background="Wheat" Foreground="Black" Text="Aaaaaa FUUUUUUUUUUUUU....."/> 
        </Border> 
       </Popup> 
       <ContentPresenter /> 
      </Grid> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsSelected" Value="true"> 
       <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/> 
       <Setter TargetName="c_popup" Property="IsOpen" Value="True"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="false"> 
       <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Window.Resources> 
<Grid> 
    <ListBox Name="listBox" 
      ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Template" Value="{StaticResource PopupListBoxItemTemplate}" /> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 
</Grid> 
+1

solución excelente seleccionado ListBoxItem

alt text

pero encontrado un error menor. Para que funcione, tuve que cambiar Setter de {StaticResource ListBoxItemTemplate} a StaticResource PopupListBoxItemTemplate}. – Caustix