WPF, размер элемента
От: Аноним  
Дата: 25.10.10 15:23
Оценка:
Необходимо вычислить размер элемента
Element.DataContext = propertyValue;
Element.Measure(new Size(1000, 1000));

Element.DesiredSize.Height - далее используется

Все нормально, кроме того, что работает Binding, в зависимости от значений класса propertyValue часть элементов прячется с экрана (установлены события на изменения состояний элементов), так вот Measure дает значения без учета, того что спрячется или появится. Потом на экране все отображается нормально. Основная мысль, то что при установке контекста события на изменение состояния не срабатывают, они срабатывают позднее. А мне необходимо вычислить размер для правильного позиционирования элемента. Как быть?
Re: WPF, размер элемента
От: Fortnum  
Дата: 25.10.10 16:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>установлены события на изменения состояний элементов


Какие события? Каких состояний? Каких элементов?

А>Measure дает значения без учета, того что спрячется или появится. [skip] при установке контекста события на изменение состояния не срабатывают, они срабатывают позднее. А мне необходимо вычислить размер для правильного позиционирования элемента. Как быть?


Попробовал. Имеем вот что.

XAML:
  Скрытый текст
<Window
    x:Class="ServEn.Test.DeferredMeasure.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ServEn.Test.DeferredMeasure.MainWindow" SizeToContent="WidthAndHeight">
    <StackPanel x:Name="DockPanel">
        <Button Content="Measure the StackPanel" Click="Button_Click"/>
        <Border Padding="10" Background="YellowGreen" x:Name="Border"
                Height="{Binding MyHeight}" Visibility="{Binding MyVisibility}"/>
    </StackPanel>
</Window>

Code-behind:
  Скрытый текст
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    class MyViewModel
    {
        public double MyHeight { get; set; }
        public Visibility MyVisibility { get; set; }
    }

    void Button_Click(object sender, RoutedEventArgs e)
    {
        Debug.Print("Border.DesiredSize.Height.1 = {0}", Border.DesiredSize.Height);

        Border.DataContext = new MyViewModel() { MyHeight = 100, MyVisibility = Visibility.Collapsed };

        Debug.Print("Border.DesiredSize.Height.2 = {0}", Border.DesiredSize.Height);

        Border.Measure(new Size(1000, 1000));

        Debug.Print("Border.DesiredSize.Height.3 = {0}", Border.DesiredSize.Height);
    }
}

В Output имеем:
  Скрытый текст
Border.DesiredSize.Height.1 = 20
Border.DesiredSize.Height.2 = 0
Border.DesiredSize.Height.3 = 0

Т.е. сразу после установки DataContext происходит биндинг и перевычисление размеров бордера.

Если MyViewModel.MyVisibility поменять на Visible, то имеем вот что:
  Скрытый текст
Border.DesiredSize.Height.1 = 20
Border.DesiredSize.Height.2 = 20
Border.DesiredSize.Height.3 = 100

Т.е. если не менять видимость элемента, после установки DataContext приходится принудительно вызывать Measure.

А значит биндинг работает не свосем предсказуемо

Но все происходит, в принципе, линейно — новые размеры получаем в том же вызове Button_Click.
Re: WPF, размер элемента
От: MxMsk Португалия  
Дата: 25.10.10 17:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Все нормально, кроме того, что работает Binding, в зависимости от значений класса propertyValue часть элементов прячется с экрана (установлены события на изменения состояний элементов), так вот Measure дает значения без учета, того что спрячется или появится.

Естественно. Не зря ведь свойство называется DesiredSize. Это размер, который элемент хотел бы занять, но не факт, что родитель ему это позволит.

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

Помимо, Measure, позвать Arrange у родительского элемента и использовать RenderSize.Height.

Но лучше бы подписаться на событие SizeChanged и брать за высоту ActualSize.
Re: WPF, размер элемента
От: Sinix  
Дата: 26.10.10 08:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Все нормально, кроме того, что работает Binding, в зависимости от значений класса propertyValue часть элементов прячется с экрана. Как быть?


Гмм... а почему не прятать элементы биндингом и не насиловать Layout?

Или вы свою панельку реализуете?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.