Как мне сделать 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
Мне удалось выяснить, как использовать решение Meleak в моем IPyapp:
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 97% времени, затрачиваемого на RecalcMatrix (), расходуется на Clear () и Add ().Изменение каждого элемента на месте было бы огромным улучшением производительности.Я сам делаю удар по нему, но всегда сложно изменить чей-то код ... http://i.stack.imgur.com/tMTWU.png
Обновление: проблемы с производительностью были в основном устранены.Спасибо Meleak!
Вот макет части реального пользовательского интерфейса моего приложения в XAML, если вы хотите попробовать его.http://pastebin.com/2EWY8NS0