WP7 Popup в визуальном дереве не учитывает ориентацию - PullRequest
1 голос
/ 08 февраля 2011

Я знаю, что есть проблемы с всплывающими окнами и ориентацией.Я читал, что если всплывающее окно находится в визуальном дереве, оно должно учитывать ориентацию.У меня есть два типа всплывающих окон, один глобальный (не в визуальном дереве) и тот, который определен на определенной странице xaml.Я еще не удосужился разобраться с глобальным, но я надеялся заставить работать конкретную страницу.

Вот мой xaml:

    x:Class="Views.MainPanorama"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit" 
    xmlns:toolkitPrimitives="clr-namespace:Microsoft.Phone.Controls.Primitives;assembly=Microsoft.Phone.Controls.Toolkit"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="PortraitOrLandscape"
    shell:SystemTray.IsVisible="False">

    <toolkit:TransitionService.NavigationInTransition>
        <toolkit:NavigationInTransition>
            <toolkit:NavigationInTransition.Backward>
                <toolkit:TurnstileTransition Mode="BackwardIn"/>
            </toolkit:NavigationInTransition.Backward>
            <toolkit:NavigationInTransition.Forward>
                <toolkit:TurnstileTransition Mode="ForwardIn"/>
            </toolkit:NavigationInTransition.Forward>
        </toolkit:NavigationInTransition>
    </toolkit:TransitionService.NavigationInTransition>
    <toolkit:TransitionService.NavigationOutTransition>
        <toolkit:NavigationOutTransition>
            <toolkit:NavigationOutTransition.Backward>
                <toolkit:TurnstileTransition Mode="BackwardOut"/>
            </toolkit:NavigationOutTransition.Backward>
            <toolkit:NavigationOutTransition.Forward>
                <toolkit:TurnstileTransition Mode="ForwardOut"/>
            </toolkit:NavigationOutTransition.Forward>
        </toolkit:NavigationOutTransition>

<ScrollViewer x:Name="mainScroll">
    <Grid x:Name="LayoutRoot" Style="{StaticResource BackgroundStyle}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Image x:Name="icon" Source="/Folder;component/Images/Icons/logo.png" Height="24" Width="175" HorizontalAlignment="Left" Margin="20, 15, 0, 0" />
        <controls:Panorama Name="panMain" HeaderTemplate="{StaticResource PanoramaHeaderTemplate}" Grid.Row="1" Margin="0, -10, 0, 0" Height="680">
            <!--Panorama definition here-->
        </controls:Panorama>
        <gbl:SecureFooter ShowLock="True" x:Name="panoFoot" Grid.Row="2" VerticalAlignment="Bottom" Margin="24, 24, 24, 0" />

        <Popup x:Name="_popup" Grid.Row="3" />
    </Grid>
</ScrollViewer>

Страница работает ипоявляется всплывающее окно, но когда я поворачиваю телефон или эмулятор, содержимое всплывающего окна не меняет ориентацию.

Я устанавливаю содержимое всплывающего окна в коде с помощью:

_popup.Child = new OneOfTwoPopupUserControls();

Может ли это быть причиной того, что всплывающее окно игнорирует ориентацию?Нужно ли иметь полное содержимое внутри при создании в xaml?

Ответы [ 4 ]

5 голосов
/ 26 ноября 2012

Если вы хотите добавить всплывающее окно в визуальное дерево, используйте следующую строку, всплывающее окно вращается правильно:

LayoutRoot.Children.Add(popupInstance);
2 голосов
/ 18 июля 2013

На самом деле довольно просто вращать всплывающее окно - или его содержимое, если быть точным - в соответствии с ориентацией. Все, что вам нужно сделать, это слушать изменения ориентации ...

static PhoneApplicationFrame ApplicationRootFrame
{
  get { return ((PhoneApplicationFrame) Application.Current.RootVisual); }
}

ApplicationRootFrame.OrientationChanged += OnOrientationChanged

И сделайте что-то вроде приведенного ниже кода. TransformGroup обеспечивает вращение всплывающего содержимого вокруг центра содержимого.

private static void ApplyOrientationTransform(PageOrientation orientation, FrameworkElement popupContent)
{
  TransformGroup group;

  switch (orientation)
  {
    case PageOrientation.LandscapeRight:
      group = new TransformGroup();
      group.Children.Add(new TranslateTransform { X = -popupContent.ActualWidth / 2, Y = -popupContent.ActualHeight / 2 });
      group.Children.Add(new RotateTransform {CenterX = 0, CenterY = 0, Angle = -90});
      group.Children.Add(new TranslateTransform { X = popupContent.ActualWidth / 2, Y = popupContent.ActualHeight / 2 });
      popupContent.RenderTransform = group;
      break;
    case PageOrientation.LandscapeLeft:
      group = new TransformGroup();
      group.Children.Add(new TranslateTransform { X = -popupContent.ActualWidth / 2, Y = -popupContent.ActualHeight / 2 });
      group.Children.Add(new RotateTransform {CenterX = 0, CenterY = 0, Angle = 90});
      group.Children.Add(new TranslateTransform { X = popupContent.ActualWidth / 2, Y = popupContent.ActualHeight / 2 });
      popupContent.RenderTransform = group;
      break;
    default:
      popupContent.RenderTransform = null;
      break;
  }
}
2 голосов
/ 08 февраля 2011

Из того, что я понимаю, Popup живет за пределами визуального дерева страницы, поскольку страница обрабатывает изменения ориентации, на которые сам Popup не влияет.ориентация изменила события и делает свое собственное преобразование всплывающего содержимого.Не идеально и не работает для меня.В конце концов я выбросил всплывающее окно.

Извините, я не мог больше помочь.

0 голосов
/ 19 мая 2014

Первоначально я попробовал ответ, как описано Оливером, но обнаружил, что размер всплывающего окна необходимо изменить для информации, которую я пытался отобразить. Я немного обманул, чтобы завершить аналогичную проблему, которая у меня была.

Изначально у меня были все всплывающие окна, рассчитанные в методе showPopup:

private void showPopup()
    {
        Session session = App.getSession();
        Template template = session.getTemplate();

        border.BorderBrush = new SolidColorBrush(Colors.White);
        border.BorderThickness = new Thickness(2);
        border.Margin = new Thickness(10, 10, 10, 10);
        int initialMargin ;
        int landMargin ; // margin for information if displayed in landscape orientation
        StackPanel stkPnlOuter = new StackPanel();
        stkPnlOuter.Background = new SolidColorBrush(Colors.Black);
        stkPnlOuter.Orientation = System.Windows.Controls.Orientation.Vertical;
        stkPnlOuter.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(stkPnlOuter_Tap);
        if (this.Orientation == PageOrientation.PortraitUp || this.Orientation == PageOrientation.PortraitDown)
        {
            initialMargin = 0;
            landMargin = 0;
        }
        else
        {
            initialMargin = 5;
            landMargin = 10;
        }

        TextBlock txt_blk1 = new TextBlock();
        txt_blk1.Text = "Loaded Type:";
        txt_blk1.TextAlignment = TextAlignment.Left;
        txt_blk1.FontSize = 20;
        txt_blk1.FontWeight = FontWeights.Bold;
        txt_blk1.Margin = new Thickness(5, 5, 5, 5);
        txt_blk1.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk2 = new TextBlock();
        txt_blk2.Text = template.templateType == TemplateType.TYPE.TEMPLATE_FILE ? "Valido Template File" : "Valido Assessment File";
        txt_blk2.TextAlignment = TextAlignment.Left;
        txt_blk2.FontSize = 20;
        txt_blk2.Margin = new Thickness(5,initialMargin, 5, initialMargin);
        txt_blk2.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk3 = new TextBlock();
        txt_blk3.Text = "Template Type:";
        txt_blk3.TextAlignment = TextAlignment.Left;
        txt_blk3.FontSize = 20;
        txt_blk3.FontWeight = FontWeights.Bold;
        txt_blk3.Margin = new Thickness(5, 10, 5, 5);
        txt_blk3.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk4 = new TextBlock();
        txt_blk4.Text = TemplateClassification.getName();
        txt_blk4.TextAlignment = TextAlignment.Left;
        txt_blk4.FontSize = 20;
        txt_blk4.Margin = new Thickness(5, landMargin, 5, initialMargin);
        txt_blk4.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk5 = new TextBlock();
        txt_blk5.Text = "Client Reference:";
        txt_blk5.TextAlignment = TextAlignment.Left;
        txt_blk5.FontWeight = FontWeights.Bold;
        txt_blk5.FontSize = 20;
        txt_blk5.Margin = new Thickness(5, 10, 5, 5);
        txt_blk5.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk6 = new TextBlock();
        txt_blk6.Text = template.ClientRef == null ? "-" : template.ClientRef;
        txt_blk6.TextAlignment = TextAlignment.Left;
        txt_blk6.FontSize = 20;
        txt_blk6.Margin = new Thickness(5, landMargin, 5, initialMargin);
        txt_blk6.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk7 = new TextBlock();
        txt_blk7.Text = "Template Code:";
        txt_blk7.TextAlignment = TextAlignment.Left;
        txt_blk7.FontWeight = FontWeights.Bold;
        txt_blk7.FontSize = 20;
        txt_blk7.Margin = new Thickness(5, 10, 5, 5);
        txt_blk7.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk8 = new TextBlock();
        txt_blk8.Text = template.Code;
        txt_blk8.TextAlignment = TextAlignment.Left;
        txt_blk8.FontSize = 20;
        txt_blk8.Margin = new Thickness(5, landMargin, 5, initialMargin);
        txt_blk8.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk9 = new TextBlock();
        txt_blk9.Text = "Template Title:";
        txt_blk9.TextAlignment = TextAlignment.Left;
        txt_blk9.FontWeight = FontWeights.Bold;
        txt_blk9.FontSize = 20;
        txt_blk9.Margin = new Thickness(5, 10, 5, 5);
        txt_blk9.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk10 = new TextBlock();
        txt_blk10.Text = template.Title;
        txt_blk10.TextAlignment = TextAlignment.Left;
        txt_blk10.FontSize = 20;
        txt_blk10.Margin = new Thickness(5, landMargin, 5, initialMargin);
        txt_blk10.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk11 = new TextBlock();
        txt_blk11.Text = "Modified Date:";
        txt_blk11.TextAlignment = TextAlignment.Left;
        txt_blk11.FontWeight = FontWeights.Bold;
        txt_blk11.FontSize = 20;
        txt_blk11.Margin = new Thickness(5, 10, 5, 5);
        txt_blk11.Foreground = new SolidColorBrush(Colors.White);

        TextBlock txt_blk12 = new TextBlock();
        txt_blk12.Text = Valido_CA.modCommon.DateFromString(template.ModifiedDate);
        txt_blk12.TextAlignment = TextAlignment.Left;
        txt_blk12.FontSize = 20;
        txt_blk12.Margin = new Thickness(5, landMargin, 5, 5);
        txt_blk12.Foreground = new SolidColorBrush(Colors.White);

        if (this.Orientation == PageOrientation.PortraitUp || this.Orientation == PageOrientation.PortraitDown)
        {


            stkPnlOuter.Children.Add(txt_blk1);
            stkPnlOuter.Children.Add(txt_blk2);
            stkPnlOuter.Children.Add(txt_blk3);
            stkPnlOuter.Children.Add(txt_blk4);
            stkPnlOuter.Children.Add(txt_blk5);
            stkPnlOuter.Children.Add(txt_blk6);
            stkPnlOuter.Children.Add(txt_blk7);
            stkPnlOuter.Children.Add(txt_blk8);
            stkPnlOuter.Children.Add(txt_blk9);
            stkPnlOuter.Children.Add(txt_blk10);
            stkPnlOuter.Children.Add(txt_blk11);
            stkPnlOuter.Children.Add(txt_blk12);
        }
        else
        {
            StackPanel stkPnlLeft = new StackPanel();
            stkPnlLeft.Orientation = System.Windows.Controls.Orientation.Vertical;
            stkPnlLeft.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
            StackPanel stkPnlRight = new StackPanel();
            stkPnlRight.Orientation = System.Windows.Controls.Orientation.Vertical;
            stkPnlRight.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;

            stkPnlOuter.Orientation = System.Windows.Controls.Orientation.Horizontal;

            stkPnlLeft.Children.Add(txt_blk1);
            stkPnlRight.Children.Add(txt_blk2);
            stkPnlLeft.Children.Add(txt_blk3);
            stkPnlRight.Children.Add(txt_blk4);
            stkPnlLeft.Children.Add(txt_blk5);
            stkPnlRight.Children.Add(txt_blk6);
            stkPnlLeft.Children.Add(txt_blk7);
            stkPnlRight.Children.Add(txt_blk8);
            stkPnlLeft.Children.Add(txt_blk9);
            stkPnlRight.Children.Add(txt_blk10);
            stkPnlLeft.Children.Add(txt_blk11);
            stkPnlRight.Children.Add(txt_blk12);

            stkPnlOuter.Children.Add(stkPnlLeft);
            stkPnlOuter.Children.Add(stkPnlRight);
        }

        StackPanel stkPnlInner = new StackPanel();
        stkPnlInner.Orientation = System.Windows.Controls.Orientation.Horizontal;
        stkPnlInner.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;

        Button btn_OK = new Button();
        btn_OK.Content = "OK";
        btn_OK.Width = 100;
        btn_OK.Click += new RoutedEventHandler(btn_OK_Click);



        stkPnlInner.Children.Add(btn_OK);
        stkPnlInner.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;

        stkPnlOuter.Children.Add(stkPnlInner);

        border.Child = stkPnlOuter;
        if (this.Orientation == PageOrientation.PortraitUp || this.Orientation == PageOrientation.PortraitDown)
        {
            border.Width = 350;
            border.Height = 500;
            transforBorder(border);
            infoPopup.Child = border;

            infoPopup.IsOpen = true;
            infoPopup.VerticalOffset = (this.ActualHeight - border.Height) / 2;
            infoPopup.HorizontalOffset = (this.ActualWidth - border.Width) / 2;
        }
        else
        {

            border.Width = 600;
            border.Height = 350;
            transforBorder(border);
            infoPopup.Child = border;
            infoPopup.IsOpen = true;
            infoPopup.HorizontalOffset = (this.ActualHeight - border.Width) / 2;
            infoPopup.VerticalOffset = (this.ActualWidth - border.Height) / 2;
        }



    }

затем в методе OrientationChanged я использовал infoPopup.IsOpen = false, затем снова вызвал метод showPopup.

Возможно, это немного неаккуратный способ сделать это, но, поскольку мне нужно было изменить ширину и высоту границы, я обнаружил, что простым было выполнить задачу.

...