@ Афекс: Конечно! Удачи с вещами IronPython :)
Обманчиво простой вопрос, который я пытался решить. Я хочу элемент управления (или некоторую магию компоновки 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