Вычисление автоматического размера строк / столбцов сетки

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

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

В настоящее время я делаю это, вычисляя из всех RowDefinitions / ColumnDefinitions какой размер "*" , чем используя эти размеры, чтобы выяснить, где произошел щелчок в Grid . Я сталкиваюсь с проблемами, когда достигаю "Auto" размера.

Я знаю, что вы можете использовать XamlReader.Parse() для создания дерева объектов из XAML, проанализировать его в объект верхнего уровня, и если этот объект является a FrameworkElement или a UIElement , вы можете использовать ActualWidth / ActualHeight или Measure() , чтобы выяснить, насколько велик объект (w / size "Auto" ) на самом деле.

Моя проблема связана с тем фактом, что я действительно имею дело только с XmlElement и XmlNode (и) для анализа через мой XAML. Я не могу использовать один из них для FrameworkElement использования .Parse() , потому что они не являются элементами верхнего уровня, и некоторые из них требуют ресурсов, определенных в элементе верхнего уровня.

Любые мысли / идеи о том, как я могу получить ActualWdith / ActualHeight или вычислить, что "Auto" находится в C # codebehind?

РЕДАКТИРОВАТЬ: конкретный сценарий из XAML, с которым я работаю, немного упростил.

 <root>
    <!-- resources here -->
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="252" />
            <RowDefinition Height="77" />
            <RowDefinition Height="168" />
            <RowDefinition Height="170" />
            <RowDefinition Height="85" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>    
        <Grid Grid.Row="5">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" /> <!-- How big is this? -->
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <ContentControl Content="{ns:Foo Name=A}" />
                <ContentControl Grid.Row="1" Content="{ns:Foo Name=B}" />
            </Grid>
        </Grid>
    </Grid>
</root>
 

Комментарии:

1. Я не думаю, что вы получите большую помощь, если не опубликуете какой-нибудь соответствующий код и пример XAML, который вы пытаетесь проанализировать, или что-то в этом роде.

2. @HighCore дело в том, что это должно быть в состоянии работать для «любого» XAML. Но я все равно опубликовал конкретный пример