2010-10-28 13 views
8

Tengo una ventana emergente de WPF simple que estoy mostrando cuando el usuario hace clic en un botón.¿Por qué mi Ventana emergente se muestra frente a la propiedad Ubicación en algunas máquinas?

<Button 
    x:Name="aButton" 
    Content="Up/Down" 
    Width="75" 
    Height="30" 
    Click="aButton_Click" 
/> 
<Popup 
    PlacementTarget="{Binding ElementName=aButton}" 
    Placement="Right" 
    VerticalOffset="-31" 
    StaysOpen="False" 
    AllowsTransparency="True" 
> 
    <StackPanel> 
     <Button Width="45" Height="45" Margin="2,0,2,2" Content="+"/> 
     <Button Width="45" Height="45" Margin="2,0,2,0" Content="-"/> 
    </StackPanel> 
</Popup> 

Lo que es extremadamente extraño ... es que este código funciona de manera diferente según la máquina en la que se ejecute.

Ejecuto este código en mi escritorio principal y todo funciona bien ... y como debería. Lo ejecuto en mi netbook PDC09 ... y la ventana emergente muestra el lado opuesto (a la izquierda en lugar de a la derecha como lo dije con la propiedad Placement).

¿Por qué es esto? ¿Y qué puedo hacer al respecto?

Respuesta

11

No pude encontrar nada a través de Google ... pero una búsqueda de la suerte en el WPF forum, encontré rápidamente post. Nota para mí: no olvides buscar en los foros de WPF si Google no puede encontrar nada.

La respuesta es que mi netbook PDC09 es una Tablet PC en el corazón, y aparentemente, Microsoft pensó que era una buena idea mostrar Popup frente a la propiedad Placement en una Tablet PC configurada para diestros ... de modo que Popup no aparezca bajo la mano del usuario.

La solución es volver a la ubicación emergente personalizada ... si no desea este comportamiento.

Me encantaría conocer otras formas de solucionar este problema.

+1

¡Gran hallazgo, gracias! – cunningdave

+0

Y, por cierto, siempre busco SO para encontrar lo que otras personas han encontrado en los foros apropiados. ;) – cunningdave

+1

Me alegro de ayudarte ... cosas como esta, vuelve loco. – cplotts

0

Resolví este problema agregando un borde en la misma cuadrícula col/fila como el destino de ubicación deseado. A continuación, establezca esto como el destino de ubicación en su lugar. Al vincular el ancho de este borde al contenido emergente, ajustará su ancho automáticamente, por lo tanto, la alineación (izquierda o derecha) es irrelevante. Si aún desea controlar la alineación, puede hacerlo alineando el borde del objetivo de ubicación. Espero que tenga sentido, si no, aquí hay un ejemplo rápido.

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <Popup x:Name="StartMenuPopup" Placement="Top" PlacementTarget="{Binding ElementName=PopupTarget}" > 
     <Border x:Name="PopupBorder"> 
     </Border> 
    </Popup> 

    <Border x:Name="PopupTarget" Grid.Row="1" Width="{Binding ActualWidth, Mode=OneWay, ElementName=PopupBorder}" 
     BorderThickness="0" HorizontalAlignment="Left" VerticalAlignment="Top"/> 

    <startmenu:TaskBar Grid.Row="1"> 
     <startmenu:TaskBar.StartButton> 
      <startmenu:ToggleMenu Width="36" x:Name="StartButton" 
           ImageData="{Binding StartButtonImageData}" 
           AssociatedPopup="{Binding ElementName=StartMenuPopup}" 
           IsOpen="{Binding StartMenuOpen, Mode=TwoWay}"/> 
     </startmenu:TaskBar.StartButton> 
    </startmenu:TaskBar> 
</Grid> 

El PlacementTarget emergente se une a la frontera PopupTarget, y el ancho del borde PopupTarget se une de nuevo al elemento PopupBorder. Esto hace que el borde del PopupTarget tenga el mismo ancho que el elemento emergente, por lo tanto, se anula el problema de alineación.

Cuestiones relacionadas