@ Афекс: Конечно! Удачи с вещами IronPython :)

делать WrapPanel с некоторыми элементами, имеющими высоту *?

Обманчиво простой вопрос, который я пытался решить. Я хочу элемент управления (или некоторую магию компоновки XAML), который ведет себя подобно сетке, которая имеет несколько строк с высотой *, но поддерживает перенос столбцов. Ад; Назовите это WrapGrid. :)

Вот макет для визуализации этого. Представьте себе сетку, определенную так:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="400">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Button Grid.Row="0" MinHeight="30">I'm auto-sized.</Button>
        <Button Grid.Row="1" MinHeight="90">I'm star-sized.</Button>
        <Button Grid.Row="2" MinHeight="30">I'm auto-sized.</Button>
        <Button Grid.Row="3" MinHeight="90">I'm star-sized, too!</Button>
        <Button Grid.Row="4" MinHeight="30">I'm auto-sized.</Button>
        <Button Grid.Row="5" MinHeight="30">I'm auto-sized.</Button>
    </Grid>
</Window>

Я хочу, чтобы эта панель былаОберните элемент в дополнительный столбец, если элемент не может быть меньше его minHeight. Вот ужасный MSPaint с некоторыми макетами, которые я сделал, детализируя этот процесс.

Вспомните из XAML, что кнопки автоматического размера имеют minHeights 30, а кнопки звездного размера имеют minHeights 90.

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

Как это может быть сделано? Я приму любое решение, будь то через xaml или с некоторым выделением кода (хотя я бы предпочел чистый XAML, если это возможно, поскольку код позади xaml сложнее реализовать в IronPython).

Обновлено за вознаграждение

Решение Мелеака

Мне удалось выяснить, как использовать решение Meleak в моем приложении IPy:

1) я скомпилировалWrapGridPanel.cs в DLL сcsc:

C:\Projects\WrapGridTest\WrapGridTest>csc /target:library "WrapGridPanel.cs" /optimize /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\PresentationFramework.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\PresentationCore.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\WindowsBase.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Xaml.dll" 

Обновить: Добавил/optimize переключатель, это немного увеличивает производительность

2) Я добавил его в xaml моего приложения со следующей строкой.

xmlns:local="clr-namespace:WrapGridTest;assembly=WrapGridPanel.dll"

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

clr.AddReference("WrapGridPanel.dll")
from WrapGridTest import WrapGridPanel
wgp = WrapGridPanel()

Низкая производительность при изменении размера:

В моем приложении IronPython изменение размера окна, содержащего этот WrapGridPanel, происходит медленно и непросто. Может лиRecalcMatrix() алгоритм будет оптимизирован? Может ли это быть вызвано реже? Может быть, переопределениеMeasureOverride а такжеArrangeOverrideКак предположил Николай, будет лучше?

Обновить: По данным VS2010 Instrumentation Profiler, 97% времени, затрачиваемого на RecalcMatrix (), тратится на Clear () и Add (). Изменение каждого элемента на месте было бы огромным улучшением производительности. Я сам бьюсь над этим, но всегда сложно изменить чужой код ...http://i.stack.imgur.com/tMTWU.png

Обновление: проблемы с производительностью были в основном устранены. Спасибо Meleak!

Вот макет части реального пользовательского интерфейса моего приложения в XAML, если вы хотите попробовать его.http://pastebin.com/2EWY8NS0

Ответы на вопрос(1)

Ваш ответ на вопрос