2011-04-20 43 views
10

ile hareket eder. Umarım bu, WPF uzmanlarının sizin için hızlıdır. Dizin hareket ettiğinde veya boyut değiştirdiğinde popomun hareket etmesini sağlamak için kolay bir XAML çözümü var mı? Kod aşağıda. Değilse, her zaman arka planda koddaki bir olayı halledebilirim.Popup denetimi,

<Grid> 
    <Canvas> 
     <Expander Header="details" HorizontalAlignment="Center" VerticalAlignment="Top" ExpandDirection="Down" 
        Expanded="Expander_Expanded" Panel.ZIndex="99" Collapsed="Expander_Collapsed" Name="expander"> 

       <Popup PopupAnimation="Slide" Name="popup" Width="200" Height="200" StaysOpen="True" AllowsTransparency="True" 
         IsOpen="False" > 
       <Grid Background="Cornsilk"> 
        <Grid.BitmapEffect> 
         <DropShadowBitmapEffect/> 
        </Grid.BitmapEffect> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
        <TextBlock TextWrapping="Wrap" FontWeight="Bold"> 
         Some example text 
        </TextBlock> 
       </Grid> 
      </Popup> 

     </Expander> 
    </Canvas> 
</Grid> 

cevap

3

İşte kullanarak bir çözüm::

Bu işaretleme salt örnek bir metin kutusu ve bir pop-up oluşur Sen burada açıklanan bir hile kullanabilirsiniz. Metin kutusu odaklandığında açılan açılır. Açılır pencere, pencerenin konum değiştirilen olayını çırparak ve buna göre kendini yeniden konumlandırmak için pop-up'ı zorlayarak hareket ettikçe pencereyi izler. Başka bir bağımlılık tanıtmak kesinlikle hiçbir neden gördükleri için

<Grid> 
    <StackPanel> 
     <TextBox x:Name="textBox1" Width="200" Height="20"/> 
     <Popup PlacementTarget="{Binding ElementName=textBox1}" IsOpen="{Binding IsKeyboardFocused, ElementName=textBox1, Mode=OneWay}"> 
      <TextBlock Background="White" Text="Sample Popup content."/> 
      <p:Attached.Operations> 
       <p:EventHandler Path="Loaded"> 
        <p:ScriptHandler Path="@FindAncestor([Window], @AssociatedObject.PlacementTarget).LocationChanged"> 
         @AssociatedObject.HorizontalOffset += 1; 
         @AssociatedObject.HorizontalOffset -= 1; 
        </p:ScriptHandler> 
       </p:EventHandler> 
      </p:Attached.Operations> 
     </Popup> 
    </StackPanel> 
</Grid> 
+0

Bu kodu denedim ve Markup Porgraming harika çalışıyor, ancak bu konuda bilmek istediğim tek şey, pencerenin görev çubuğunun altına sürüklenip sürüklenmediği, pencerenin ekranın ortasına geri döndüğü ve asla geri dönmeyeceğiydi. Bu senaryoyu ele almanın bir yolu var mı? –

20

Bu, arka planda kodlama hemen hemen Rick'in cevabı ancak içindedir.

protected override void OnLocationChanged(EventArgs e) 
{ 
    popup.HorizontalOffset += 1; 
    popup.HorizontalOffset -= 1; 
    base.OnLocationChanged(e); 
} 

Hemen arkası kod sizin pencerenin için & macunu kopyalayıp açılan örneğinin tanımlayıcı biriyle popup kimlik değiştirir.


Ben daha özlü, öyle çok daha iyi bulmak, size gelen ya da bellek sızıntısı çıkmak için ya gerekecek olayları kullanmaz.
Ve uygulamanızın çalışma zamanı için, geçersiz kılma daha iyi performanslara sahip olacaktır (fark edilebilecek hiçbir şey yoktur, ancak sizinki gibi mikro-performans irrasyonalistleri hala bunu sevecektir).