2014-05-08 11 views
5

Jeśli zmienię StaysOpen na "True", pojawi się wyskakujące okienko, ale nie zamyka się po kliknięciu poza nim, więc to nie jest to, czego chcę.Wyskakujące okienko nie otwiera się, jeśli StaysOpen = "False"

Oto odpowiedni kod XAML:

<Border x:Name="popupPlacementTarget"> 
    <i:Interaction.Behaviors> 
     <local:PopupBehavior> 
      <local:PopupBehavior.Popup> 
       <Popup PlacementTarget="{Binding ElementName=popupPlacementTarget}" 
         Placement="MousePoint" 
         StaysOpen="False"> 
        <ContentPresenter Content="{Binding SomeContent}" ContentTemplate="{StaticResource SomeContentTemplate}" /> 
       </Popup> 
      <local:PopupBehavior.Popup> 
     </local:PopupBehavior> 
    </i:Interaction.Behaviors> 
</Border> 

A oto kod PopupBehavior:

public class PopupBehavior : Behavior<UIElement> 
{ 
    #region Dependency Properties 

    public static readonly DependencyProperty PopupProperty = DependencyProperty.Register(
     "Popup", typeof(Popup), typeof(PopupBehavior), new FrameworkPropertyMetadata(default(Popup))); 

    #endregion Dependency Properties 

    #region Properties 

    public Popup Popup 
    { 
     get { return (Popup)this.GetValue(PopupProperty); } 
     set { this.SetValue(PopupProperty, value); } 
    } 

    #endregion Properties 

    #region Protected Methods 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     this.AssociatedObject.MouseDown += this.OnMouseDown; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 

     this.AssociatedObject.MouseDown -= this.OnMouseDown; 
    } 

    #endregion Protected Methods 

    #region Private Methods 

    private void OnMouseDown(object sender, MouseButtonEventArgs eventArgs) 
    { 
     var popup = this.Popup; 
     if (popup == null) 
     { 
      return; 
     } 

     this.Popup.IsOpen = true; 
    } 

    #endregion Private Methods 
} 

Każdy pomysł, dlaczego mój okienko nie pojawi się z StaysOpen = "false"?

+0

możliwy duplikat [StayOpen = "False" z odziedziczonymi popupami] (http://stackoverflow.com/questions/21464557/stayopen-false-with-inited-popups). Proszę zobaczyć moją odpowiedź z tego połączonego pytania na rozwiązanie twojego problemu. – Sheridan

+1

Nie wydaje mi się, aby odpowiedź na pytanie, które łączysz, dotyczy tego pytania. – Kelsie

+1

Czy Twój opublikowany plik xaml jest kompletny? Obecnie wygląda na to, że dodajesz 'Zachowanie' jako dziecko do' Border' niż w ' ...' – Viv

Odpowiedz

0

Okazuje się, że był przodek, który bezkrytycznie chwytał przechwytywanie myszką w dół. Wszystko działa poprawnie teraz, gdy poprawiłem ten problem.

Odłożyłem na bok ten problem, ustawiając opcję StaysOpen = "True", dziedzicząc wyskakujące okienko i podłączając się do globalnych zdarzeń myszy w wywołanym wyskakującym okienku. Kiedy zostanie otwarte okienko popup, dołączę program obsługi do globalnych zdarzeń wejściowych. Następnie, po odebraniu zdarzenia, filtruję je tak, że odpowiadam tylko na zdarzenia z lewego przycisku myszy. Podczas obsługi tego zdarzenia zamknę okienko wyskakujące i zdejmiemy wydarzenie, jeśli mysz nie znajduje się w okienku wyskakującym. Udało się, ale jest to oczywiście brudny hack i cieszę się, że udało mi się to bez niego.

Powiązane problemy