Comment faire pour centrer un menu contextuel dans la fenêtre (Windows store)
J'ai un contextuel personnalisé (comme un contrôle utilisateur) dont j'ai la charge par programmation. Je ne suis pas en mesure de le centrer sur l'axe x, uniquement sur la verticale. Le popup n'est pas ajouté à un fichier xaml, mais elle est ajoutée à la fenêtre racine.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using System.Windows;
using Windows.UI.Core;
//The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236
namespace QSTLibrary.WIN8.Tools
{
public sealed partial class CustomProgressRingPopup : UserControl
{
public CustomProgressRingPopup()
{
this.InitializeComponent();
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
//Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text",
typeof(string),
typeof(CustomProgressRingPopup),
new PropertyMetadata("", OnTextChanged));
public void OpenPopup()
{
this.ParentPopup.IsOpen = true;
}
public void ClosePopup()
{
this.ParentPopup.IsOpen = false;
}
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var instance = d as CustomProgressRingPopup;
var newValue = e.NewValue as string;
if (instance != null && newValue != null)
{
instance.CustomTextBlock.Text = newValue;
}
}
private void OnPopupLoaded(object sender, RoutedEventArgs e)
{
this.ParentPopup.HorizontalOffset = (Window.Current.Bounds.Width - gdChild.ActualWidth) / 2;
this.ParentPopup.VerticalOffset = (Window.Current.Bounds.Height - gdChild.ActualHeight) / 2;
}
}
}
userControl xaml:
<UserControl
x:Class="QSTLibrary.WIN8.Tools.CustomProgressRingPopup"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:QSTLibrary.WIN8.Tools"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<Popup x:Name="ParentPopup" HorizontalAlignment="Center" VerticalAlignment="Center" Loaded="OnPopupLoaded">
<Grid x:Name="gdChild" Height="auto" Width="auto" Background="Blue" Margin="20">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressRing x:Name="CustomProgressRing" Height="40" Width="40" IsActive="true" Grid.Column="0" Margin="20"/>
<TextBlock x:Name="CustomTextBlock" Height="auto" Width="auto" FontSize="25" Grid.Column="1" Margin="20"/>
</Grid>
</Popup>
</UserControl>
Voici comment je l'utilise: externe:
_loginProgressRingPopup.Text = "Logging in";
_loginProgressRingPopup.OpenPopup();
OriginalL'auteur Alexandru Circus | 2013-09-26
Vous devez vous connecter pour publier un commentaire.
J'ai ajouté le LayoutUpdate rappel de la fenêtre dans le fichier cs et fonctionne maintenant.
et le popup à partir de XAML:
Nous sommes confrontés au même problème, mais ne sont pas en mesure de mettre en œuvre votre suggestion. Nous avons un menu Contextuel dans lequel nous sommes à l'aide d'un Contrôle Utilisateur qui dispose de ce code, comment devrions-nous aller sur la résolution du problème de sorte que le Cycle de Mise en page de l'Exception n'est pas levée
pouvez-vous poster un exemple (je déteste demander de cause, il est souvent trop complexe pour le faire) je recommande le remplacement de la Fenêtre.Actuel.Les limites.Largeur" avec le nom de la grille de la racine ou d'un autre objet qui est au sommet de la pile. J'ai trouvé la "Fenêtre" était la cause de mes problèmes, mais si j'ai nommé un habillage de l'objet, il pourrait fonctionner.
Il semble que Windows ne vous aime pas le réglage de mise en page-affecter les propriétés à l'intérieur d'un
LayoutUpdated
gestionnaire. Je suggère d'utiliser leSizeChanged
événement à la place, ce qui ne semble pas avoir ce problème.avait aussi "Présentation du cycle de détecté. Mise en page n'a pas pu terminer" problème, mais il fixe par coulée NewHorizontal et les décalages Verticaux à int
OriginalL'auteur Alexandru Circus
Le positionnement d'un
Popup
dans un UWP application du Windows Store n'est pas aussi simple qu'elle pourrait l'être. Voici comment j'ai fini par le résoudre. Plutôt que d'observer leLayoutUpdated
événement (qui peut provoquer une mise en page de cycle), d'observer laSizeChanged
cas de l'élément de niveau supérieur de votre point de vue et utilisez-la pour repositionner le popup c'est contenue à l'intérieur.Dans mon cas, je suis de positionnement de la boîte de dialogue dans le centre de la fenêtre, et donc utiliser
Window.Current
. Vous avez également besoin de convertir les coordonnées, car la fenêtre se servir de ses propres relative du système de coordonnées en fonction de l'endroit où lePopup
élément est en fait défini dans votre mise en page:OriginalL'auteur devios1
Vous pourriez centre dans le fichier XAML:
le
PlacementTarget
est le Panneau que vous souhaitez center. MainPanel existe pas par défaut, mais vous pouvez centrer dans un autre panneau.OK, je comprends cela. Mais il semble que le PlacementTarget propriété ne peut pas être appliquée à l'élément Contextuel, c'est ce que je comprends de l'erreur: "La propriété "PlacementTarget' a pas été trouvé dans type 'Popup'." Aussi, il ne pouvait pas l'auto-complétion dans le code quand j'écris Placemen... il devrait offrir l'auto-remplir la suggestion de PlacementTarget
Le projet est une des applications du Windows Store. Peut-être que le PlacementTarget n'est pas disponible pour ce type de projet. Je suis un débutant en C#, .NET....Je suis un programmeur java
Avez-vous essayé d'utiliser seulement
Grid
au lieu dePopup
? DansOpenPopup()
méthode, vous devez définir leVisibility
deGrid
. Vous aussi n'avez pas besoin de traiter avec un décalage de propriétés dePopup
si vous utilisez uniquementGrid
.OriginalL'auteur Butzke
J'ai modifié Butzke, la réponse à être plus universel:
OriginalL'auteur FocusedWolf