locked
Реакция эллементов управления на ориентацию экрана RRS feed

  • Вопрос

  • Привет. Помогите разобраться с вопросом на счет реакции элементов управления на ориентацию экрана. Я знаю что каждая страница имеет  событие  OrientationChanged. Я на него подписался и написал следующий код:

    public RegistrationPage()
            {
                InitializeComponent();
                this.OrientationChanged += new EventHandler<OrientationChangedEventArgs>(PhoneApplicationPage_OrientationChanged);
            }
    
            private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
            {
                if ((e.Orientation == PageOrientation.LandscapeRight)
                      || (e.Orientation == PageOrientation.LandscapeLeft)) 
                {
                    TitlePanel.Visibility = Visibility.Collapsed;
                }
                else if ((e.Orientation == PageOrientation.PortraitDown)
                       || (e.Orientation == PageOrientation.PortraitUp))
                {
                    TitlePanel.Visibility = Visibility.Visible;
                }
            }

    Это всем известный в просторах интернета пример. Иногда при горизонтальном положении экрана, элементы  управления размещены некрасиво. Например, если я хочу ввести текст с экранной клавиатуры  в TextBox, то я не могу ввести - клавиатура размешена неправильно.

    Подскажите, как правильно работать с отслеживанием смены экрана? В частности, как работать тогда с элементами управления. Как их отключать и перемещать.

    Спасибо.

    12 августа 2012 г. 12:33

Ответы

  • Отвечу, используя уже приведенный пример. В методе PhoneApplicationPage_OrientationChanged описываем что делать при смене ориентации экрана. В данном примере определяем горизонтальное ли или вертикальное положение экрана, хотя условия можно задать таким образом, чтобы для каждого из четырех возможных положений было бы своё представление.
    Для начала добавлю комментарии:

     private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
            {
                if ((e.Orientation == PageOrientation.LandscapeRight)
                      || (e.Orientation == PageOrientation.LandscapeLeft)) 
                {
                    TitlePanel.Visibility = Visibility.Collapsed;//здесь описываем действия для изменения положения экрана в горизонтальное
                }
                else if ((e.Orientation == PageOrientation.PortraitDown)
                       || (e.Orientation == PageOrientation.PortraitUp))
                {
                    TitlePanel.Visibility = Visibility.Visible;//здесь описываем действия для изменения положения экрана в гвертикальное
                }
            }

    Допустим у нас есть элемент управления с именем Rec1 - прямоугольник:

    <Rectangle Name="Rec1" Height="100" HorizontalAlignment="Left" Margin="170,110,0,0" Stroke="Black" StrokeThikness="1" VerticalAlignment="Top" Width="200" />

     

    У вас есть доступ ко всем свойствам элемента.
    Если речь идёт только об изменении положения, изменении размеров и видимости элемента, то:
    За отступы отвечает параметр Margin, нужно иметь ввиду что система координат отсчета отступов актуальна взависимости от горизонтального и вертикального выравнивания (HorizontalAlignment и VerticalAlignment). За размеры отвечают Height и Width (высота и ширина соответственно). За отображение отвечает два параметра Visibility (и оно используется в вашем примере) - может принимать два свойства: Visible и Collapsed. В первом случае элемент управления отображается, во втором не отображается, точнее я бы сказал даже не выводится. Если нужно просто скрыть элемент, сохранив обработку событий, конкретного элемента, то можно изменить его прозрачность - Opacity (задается в процентах).
    Соответственно и изменяйте эти свойства в обработчике события изменения положения экрана:

    Rec1.Margin = new Thickness(40,5,0,0);//чтобы изменить отступы, то есть расположение
    Rec1.Height = 25; // изменение высоты
    Rec1.Width = 25; // изменение ширины
    Rec1.Visibility = Visibility.Visible;// сделать видимым
    Rec1.Visibility = Visibility.Collapsed;// сделать невидимым
    Rec1.Opacity = 50;// установить прозрачность 50%
    




    • Предложено в качестве ответа PetrishkoMVP 12 августа 2012 г. 20:25
    • Помечено в качестве ответа Pavelgronsky 12 августа 2012 г. 21:29
    12 августа 2012 г. 20:25