Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение размера Popup окна, Размеры равны нулю 
V
    Опции темы
SAVe
Дата 9.4.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Здравствуйте.

Суть проблемы:

Есть Popup окно контент в которое записывается динамически. Затем делаем ему IsOpen = true. Но в событии Popup_Opened размеры ActualWidth и ActualHeight показвают 0. Хотя окно отображается с правильными размерами. Где то же они находятся. Подскажите пожалуста как их получить. Получить нужно или до открытия окна (как либо высчитать) или сразу поле открытия окна.

Вот разметка:
Код

<UserControl 
..... 
    Width="auto" Height="auto" >
    <Grid x:Name="LayoutRoot" Background="Transparent"  >
        <Popup Name="popUp" Height="auto" Width="auto" MouseLeftButtonUp="Popup_MouseLeftButtonUp" MouseMove="Popup_MouseMove" Opened="Popup_Opened" >
            <Border Name="bounds" Background="White" Height="auto" Width="auto" Opacity="0.3">
                
            </Border>
        </Popup>
    </Grid>
</UserControl>


В коде перед открытием окна:

Код

bounds.Child = SetUIElement(); // Устанавливает некоторый UIElement


Пробуем получать размеры:

Код

private void Popup_Opened(object sender, EventArgs e)
        {
//оба размера равны 0. Вот собственно в этом и проблема...
            visualContentWidth = popUp.ActualWidth;
            visualContentHeight = popUp.ActualHeight;
        } 

PM MAIL   Вверх
Человек01
Дата 9.4.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 20.2.2009
Где: Абакан, респ. Хак асия, Россия

Репутация: 2
Всего: 2



Может немного не понял сам вопрос, но а если сделать так:
Код

visualContentWidth = bounds.ActualWidth;
visualContentHeight = bounds.ActualHeight;

По сути получается те же высота и ширина Popup, исходя из кода конечно.
Или я всё таки, что то не так понял?
 smile 


Это сообщение отредактировал(а) Человек01 - 9.4.2009, 17:53
PM MAIL ICQ   Вверх
SAVe
Дата 10.4.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Дело в том   что у всех контролов и выше и ниже по иерархии в событии Popup_Opened параметры ActualWidth и ActualHeight равны 0.
PM MAIL   Вверх
Человек01
Дата 12.4.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 20.2.2009
Где: Абакан, респ. Хак асия, Россия

Репутация: 2
Всего: 2



SAVe, если честно то я так и не смог воспроизвести чтобы не было возможности узнать ширину высоту по  bounds
Вот весь код который я сделал для примера:
Сначала UserControl1:
Код

<UserControl x:Class="test005_usercontr_popup.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="auto" Height="auto" >
    <Grid x:Name="LayoutRoot" Background="Transparent"  >
        <Popup Name="popUp" Height="auto" Width="auto"  Opened="popUp_Opened" >
            <Border Name="bounds" Background="White" Height="auto" Width="auto" Opacity="0.3">

            </Border>
        </Popup>
    </Grid>
</UserControl>

Код

namespace test005_usercontr_popup
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
               
        private void popUp_Opened(object sender, EventArgs e)
        {            
            tb1.Text = "Ширина по bounds равна " + bounds.ActualWidth + " пикселей" ;
            tb2.Text = "Высота по bounds равна " + bounds.ActualHeight + " пикселей";
        }
        TextBlock tb1;
        TextBlock tb2;
        public void InitContent()
        {
            tb1 = new TextBlock();
            tb2 = new TextBlock();
            TextBlock tb3 = new TextBlock();
            tb3.Text = "ну вот мы и сможем накоец то узнать какая ширина высота у Popup смотрим например по bounds";
            Button bd = new Button();
            bd.Content = "Круто";
            StackPanel sp = new StackPanel();
            sp.Children.Add(tb1);
            sp.Children.Add(tb2);
            sp.Children.Add(tb3);
            sp.Children.Add(bd);
            bounds.Child =sp;
            bd.Click += new RoutedEventHandler(bd_Click);
        }

        void bd_Click(object sender, RoutedEventArgs e)
        {
            popUp.IsOpen = false;
        }
        public void OpenPopup()
        {
            
            popUp.IsOpen = true;
        }
    }
}

Теперь же сам Window1:
Код

<Window x:Class="test005_usercontr_popup.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:loc="clr-namespace:test005_usercontr_popup"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="124*" />
            <RowDefinition Height="138*" />
        </Grid.RowDefinitions>
        <loc:UserControl1 x:Name="test"></loc:UserControl1>
        <StackPanel Grid.Row="1">            
            <Button Click="Button_Click">задаем контент</Button>
            <Button Click="Button_Click_1">показываем</Button>
        </StackPanel>
    </Grid>
</Window>

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace test005_usercontr_popup
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            test.InitContent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            test.OpenPopup();
        }
    }
}

Всё замечательно работает. Странно что у тебя не получается...
В общем пользуемся и говорим Человеку спасибо  smile 
P.S.: Может у тебя там ещё, что то накручено в UserControl?

PM MAIL ICQ   Вверх
SAVe
Дата 12.4.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Человеку большое спасибо за участие в теме. Отличие моей ситуациии от приведенного кода состоит в том что наполнение которое ложится в bounds.Child создаётся не кодом контрола , а передаётся как параметр и сам Popup стартует из другого потока (по таймеру). Не знаю как это могло повлиять , но в событии Popup_Opened размеры нулевые (хотя они были и при синхронном старте нулевые).

Проблему удалось решить перехватом SizeChanged  у bounds.
PM MAIL   Вверх
Idsa
Дата 13.4.2009, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Цитата(Человек01 @  12.4.2009,  23:19 Найти цитируемый пост)
В общем пользуемся и говорим Человеку спасибо  smile 

Человек01, добрый совет: не стоит так акцентировать внимание общественности на своей личности.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Человек01
Дата 13.4.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 20.2.2009
Где: Абакан, респ. Хак асия, Россия

Репутация: 2
Всего: 2



Idsa, спасибо за "добрый совет", но человек используемый мной является собирательным "образом" него абстрактного человека, таким выражением я призываю людей быть вежливыми и не забывать говорить спасибо всем кто им помог, пытался помочь или помогал советом. А непосредственно  "акцентировать внимание общественности на своей личности" я не старался(по какому то случайному, но счастливому, стечению обстоятельств мой ник Человек01 и Человек используемый в контексте моего поста однокоренные smile ). 
И вообще с другой стороны, почему нет, если это я делаю для своего удовольствия и мне нравится видеть слово "Спасибо" после моего поста (приходит осознание что время потраченное мной, не было потрачено зря, а принесло пользу кому то). 
Так что по моему Ваш "наезд" не обоснован(+ ни каких правил форума я этим не нарушаю  smile ).
P.S.: Понимаю что это флуд, но давно не общался с людьми, так что прошу прощения за излишнюю многословность.  smile 
PM MAIL ICQ   Вверх
Idsa
Дата 13.4.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Если человек захочет сказать Вам спасибо, он это обязательно сделает. А попрошайничать, имхо, не стоит.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0981 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.