2017-06-16 6 views
0

Ich muss eine Ansicht auf einen Klick auf eine Schaltfläche zeigen. Dies ist der Code für das Ereignis ClickWie Popup-Steuerelement verwenden, um eine Ansicht anzuzeigen?

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Button s = sender as Button; 
    //some stuff needed to recognise which button was pressed 
    myPopup.PlacementTarget = s; 
    myPopup.Placement = System.Windows.Controls.Primitives.PlacementMode.Top; 
    myPopup.IsOpen = true; 
} 

dies ist das Element in XAML definiert

<Popup IsOpen="False" StaysOpen="True" Name="myPopup"> 
     <view:myCustomView /> 
</Popup> 

Ich habe 2 Problem mit diesem.

1- Der Hintergrund meiner Ansicht ist schwarz, auch wenn ich es nicht gesetzt (ich glaube, es transparent sein sollte?)

2- Wenn ich in der Popup auf eine beliebige Stelle, diese verschwinden einfach

Was ist der richtige Weg, um meine Sichtweise zu zeigen? Ich will nichts von den ViewModel binden, den Knopf zu dieser neuen Sicht besitzen, die sein eigenes Viewmodel hat

Beachten Sie, dass auf der Veranstaltung Button_Click i zum ViewModel von myCustomView einige Parameter senden, dass einige ändern seine Funktionalität (deshalb muss ich jedes Mal, wenn das Button_Click Ereignis ausgelöst wird, eine neue Instanz der Ansicht erstellen)

EDIT 1: Dank der Antwort von EdPlunkett konnte ich das Problem mit dem Hintergrund lösen. Ich brauche nur AllowsTransparency = "True" gesetzt

EDIT2:

ich meine Popup über Kodex Hinter wie vorgeschlagen, so jetzt ist mein Code:

private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      Button s = sender as Button; 
      System.Windows.Controls.Primitives.Popup popup = new System.Windows.Controls.Primitives.Popup(); 
      popup.AllowsTransparency = true; 
      popup.Child = new myCustomView(); 
      popup.PlacementTarget = s; 
      popup.Placement = System.Windows.Controls.Primitives.PlacementMode.Top; 
      popup.IsOpen = true; 
      popup.StaysOpen = true; 
     } 

Das Problem ist, dass, wenn ich Klicken Sie in eines der in myCustomView definierten Steuerelemente, das Popup verliert den Fokus und wird geschlossen.

+2

'myPopup' ist nirgendwo definiert ... meinst du' pippup'? – Fruchtzwerg

+0

@ Fruchtzwerg Ja, tut mir leid, ich habe den Namen geändert und diesen vergessen. –

+1

Fügen Sie 'AllowsTransparency =" True "' zu dem 'Popup' Element hinzu. –

Antwort

1

Ich vermute, dass die Popup innerhalb einer anderen Popup wie zum Beispiel die Dropdown-Liste einer ComboBox definiert ist, richtig?

Sie könnten versuchen, das Popup Element programmatisch in den Click-Ereignishandler zu erstellen:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Button s = sender as Button; 
    System.Windows.Controls.Primitives.Popup popup = new System.Windows.Controls.Primitives.Popup(); 
    popup.AllowsTransparency = true; 
    popup.Child = new myCustomView(); 
    //some stuff needed to recognise which button was pressed 
    popup.PlacementTarget = s; 
    popup.Placement = System.Windows.Controls.Primitives.PlacementMode.Top; 
    popup.IsOpen = true; 
    popup.StaysOpen = true; 
} 

Dies sollte können Sie in der Pop-up-Ansicht ohne die Popup geschlossen klicken. Stellen Sie sicher, dass die Ansicht, die einen Background Satz hat:

popup.Child = new myCustomView() { Background = Brushes.White }; 

Ich habe versucht, Ihre Lösung, und während es stimmt, dass sich die Situation etwas besser ist, habe ich noch die Schließung Problem haben. Ich kann in der Popup klicken, ohne diese geschlossen ist, aber wenn ich innerhalb jedem des Textbox klicken, die ich in meiner Ansicht definiert, das Popup schließen

So ist die PlacementTarget an die Mutter gesetzt ItemsControl und dann die VerticalOffset und HorizontalOffset Eigenschaften der Popup, um ihre genaue Position auf dem Bildschirm, z:

private void btn_Click(object sender, RoutedEventArgs e) 
{ 
    Button s = sender as Button; 
    System.Windows.Controls.Primitives.Popup popup = new System.Windows.Controls.Primitives.Popup(); 
    popup.AllowsTransparency = true; 
    popup.Child = new myCustomView(); 
    //some stuff needed to recognise which button was pressed 
    popup.PlacementTarget = ic; //<-- "ic" is the name of the parent ItemsControl 
    Point p = s.TranslatePoint(new Point(0, 0), ic); 
    popup.VerticalOffset = p.Y; 
    popup.HorizontalOffset = p.X; 
    popup.IsOpen = true; 
    popup.StaysOpen = true; 
} 

Sie sollten die Werte der VerticalOffset und HorizontalOffset passen Ihre Anforderungen anpassen.

+0

gelöst Er könnte das Popup in der XAML außerhalb der anderen Popup auch zu definieren, und einfach verwenden, wie er es tut , könnte er nicht? –

+0

Ja, wahrscheinlich, solange es sich nicht in einem anderen Popup befindet. Da er jedoch das Click-Ereignis behandelt, kann er auch das Popup erstellen, wenn der Button tatsächlich angeklickt wird. Es ist die eine oder andere Weise :) – mm8

+0

Leider bin ich nicht bei der Arbeit und ich kann Ihren Vorschlag nicht wiederholen. Ich werde Update Montag geben. Was ich jedoch sagen kann, ist, dass mein Popup nicht in einem anderen Popup definiert wurde, sondern in einem ItemsControl, genauer gesagt, der Button, der dieses Popup auslösen soll, ist in einer Combobox enthalten, die in dieser ItemControl-Vorlage definiert ist. Ich weiß nicht, ob es das Gleiche ist. –

Verwandte Themen