WPF RowDefinition Странност

Имам приложение, което се опитвам да отстраня, и гледам различни настройки по време на изпълнение чрез Snoop.

Проблемът, който имам е следният:

Има решетка, с височина 50,4 . Той има 3 RowDefinitions всяка с височина 1 звезда (*). Следователно може да се предположи, че всяка дефиниция на ред ще има действителна височина от 50,4/3 (16,8). Виждам обаче, че първите 2 RowDefinitions имат ActualHeight от 25,2, а третият има ActualHeight от 0. И трите все още имат Height от 1 звезда.

Как е възможно ? Просто виждам как можете да постигнете тази ситуация. Не можете да промените ActualHeight граматически, тъй като е само за четене. Височините трябва да са зададени в пропуска за подреждане на мрежата.

Някой знае ли за набор от обстоятелства, които биха довели до този сценарий.


person Dean Chalk    schedule 21.08.2012    source източник
comment
Можете ли да предоставите малък, но пълен примерен проект за възпроизвеждане на това поведение?   -  person Daniel Hilgarth    schedule 21.08.2012
comment
Боя се, че не, има проблем с това много сложно приложение. Нещо създава този сценарий, който смятах, че е невъзможен. Търся някакви идеи как може да се случи това, които биха ми помогнали да открия причината   -  person Dean Chalk    schedule 21.08.2012
comment
Сигурен съм, че ще придобиете много прозрения, опитвайки се да създадете такава минимална извадка. Ще започнете с вашето сложно приложение и ще премахнете все повече и повече код. В един момент премахвате някакъв код и проблемът вече не се появява. Вече знаете коя е обидната част от кода...   -  person Daniel Hilgarth    schedule 21.08.2012
comment
Може би някой променя височината на реда от задния код?   -  person dvvrd    schedule 21.08.2012
comment
Може би малко несръчно изразих желанието си за отговор. Бих могъл да прекарам дни в деконструиране на приложението и съм сигурен, че в даден момент ще получа момент на Еврика. Причината, поради която публикувах въпроса тук, е да видя дали някой просто „знае“ сценарий, който може да доведе до тази ситуация. Ако никой не отговори, имам още много работа :)   -  person Dean Chalk    schedule 21.08.2012


Отговори (1)


Намерих отговора - не знам дали е грешка в WPF или че не съм прочел документацията правилно

<Border Background="Red" HorizontalAlignment="Center" VerticalAlignment="Center">
    <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBox Text="123" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <TextBox Text="123" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed" />
        <TextBox Text="123" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed" />
    </Grid>
</Border>

Ако погледнете кода, ще видите, че има 3 реда с размер звезда (*), които ВСИЧКИ трябва да имат еднакъв дял от височината на мрежата, независимо от тяхното съдържание.

Въпреки това, когато свиете ЦЯЛОТО съдържание, присвоено на този ред, самият ред СЪЩО се свива. (ако го подслушвате, той има височина *, но ActualHeight е 0)

Някой смята ли това за нормално поведение? Никога не съм чувал за това в цялата си разработка на WPF през последните 5 години

person Dean Chalk    schedule 21.08.2012
comment
Вашият Border има ли дефинирана височина или също се свива (или свива), когато редът се свива? - person CodingGorilla; 21.08.2012
comment
Нищо няма определена височина, така че границата автоматично ще се оразмерява според съдържанието си. Не се нуждаете от границата, за да може този код да се държи по този начин, сложих границата там, така че червеният фон да ви показва, че решетката има свит ред - person Dean Chalk; 21.08.2012
comment
Точно, това, което имах предвид, беше дали има определена височина или не. Ако няма дефинирана височина, това е поведението, което бих очаквал. Поставете мрежата в DockPanel или й задайте фиксирана височина и ще получите поведението, което очаквате. Това е свързано с опита на мрежата да измери височината си и тъй като редът няма какво да измерва, редът завършва с височина 0 и намалява общата височина на мрежата. - person CodingGorilla; 21.08.2012
comment
Добре, мисля, че ударихте ноктите на главата. По принцип, ако няма фиксиран размер на мрежата, тогава всеки ред, който няма присвоено съдържание (или свито съдържание) и е с размер на звезда, основно ще изчезне, сякаш не е бил в XAML на първо място. Предполагам, че същото поведение ще бъде очевидно с колоните. Благодаря за това - не всеки ден научаваш нещо ново, което е толкова фундаментално :) - person Dean Chalk; 21.08.2012