2010-10-28 1 views
8

Ho un semplice Popup WPF che sto mostrando quando l'utente fa clic su un pulsante.Perché il mio Popup mostra di fronte alla proprietà Placement su alcune macchine?

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

Ciò che è estremamente strano ... è che questo codice funziona in modo diverso a seconda del computer su cui viene eseguito.

Eseguo questo codice sul mio desktop principale e tutto funziona bene ... e come dovrebbe. Lo eseguo sul mio netbook PDC09 ... e il Popup mostra l'opposto (a sinistra invece di destra come gli ho detto con la proprietà Placement).

Perché è questo? E cosa posso fare a riguardo?

risposta

11

Non ho trovato nulla tramite Google ... ma una ricerca fortunata nel WPF forum, trovato rapidamente questo post. Nota per se stessi: non dimenticare di cercare nei forum WPF se Google non riesce a trovare nulla.

La risposta è che il mio PDC09 netbook è un Tablet PC a cuore, ea quanto pare, Microsoft ha pensato che fosse una buona idea per mostrare il Popup opposta alla proprietà Placement su un Tablet PC che è configurato per le persone destrimani ... tale che il Popup non appaia sotto la mano dell'utente.

La soluzione è ripristinare il posizionamento personalizzato di Popup ... se non si desidera questo comportamento.

Mi piacerebbe conoscere altri modi per risolvere questo problema.

+1

Grande scoperta, grazie! – cunningdave

+0

E btw, cerco sempre SO per trovare ciò che altre persone hanno trovato nei forum appropriati. ;) – cunningdave

+1

Felice di aiutarti ... cose del genere, mi fanno impazzire. – cplotts

0

Ho risolto questo problema aggiungendo un bordo nella stessa colonna/colonna della destinazione di posizionamento desiderata. Quindi imposta questo come target di posizionamento. Associando la larghezza di questo bordo al contenuto popup si regolerà automaticamente la larghezza, quindi l'allineamento (sinistro o destro) è irrilevante. Se si desidera controllare ancora l'allineamento, è possibile farlo allineando il bordo del bersaglio di posizionamento. Spero che abbia senso, se no, ecco un rapido esempio.

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

Il PlacementTarget pop-up si lega al confine PopupTarget, e la larghezza del bordo PopupTarget lega torna all'elemento PopupBorder. Ciò rende il bordo di PopupTarget della stessa larghezza del popup, annullando quindi il problema di allineamento.