сайт Документации Apache имеет хорошее введение в использование mod_rewrite.
Это покрывает, как директива работает и имеет довольно много примеров, например:
RewriteRule ^/games.* /usr/local/games/web
RewriteRule ^/product/(.*)/view$ /var/web/productdb/$1
Это покрывает все от основного sytanx для изменения URI (который является тем, что Вы, казалось, спрашивали о), а также использовать регулярные выражения, условия и отвечать перенаправлениями.
апачские документы всегда были полезны для меня. O'Reilly Apache: Полное руководство является также хорошим физическим ресурсом.
Замените панель управления элементом на UniformGrid, это изменит размер всех дочерних элементов, чтобы все соответствовало точно:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<!-- width must be explicitly set for this example -->
<StackPanel
Name="MyStack"
Orientation="Horizontal"
Width="250"
Load="Window_Loaded">
<Button/>
<Button/>
<Button/>
</StackPanel>
public void Window_Loaded(object sender, RoutedEventArgs e)
{
UIElementCollection elements = MyStack.Children;
int count = elements.Count;
foreach (UIElement element in elements)
{
if (element is Button)
((Button)element).Width = MyStack.Width / count;
}
}
На основе ответа Нира я смог выполнить свой необязательный критерий, разрешающий растягивание нескольких строк под управлением WPF.
Сначала вы должны иметь возможность изменять свойства шаблона UniformGrid . Для этого вам нужно сохранить ссылку на него. Для этого существует несколько методов . Я решил обработать событие Loaded для UniformGrid и сохранить ссылку в это время.
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1" Loaded="UniformGrid_Loaded" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
И в коде позади:
UniformGrid uniformgridButtons;
private void UniformGrid_Loaded(object sender, RoutedEventArgs e)
{
uniformgridButtons = sender as UniformGrid;
}
Затем обработайте SizeChanged и настройте параметр строк в соответствии с любыми критериями.
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if ((uniformgridButtons != null) && (this.Width > 0))
{
// Set row count according to your requirements
uniformgridButtons.Rows = (int)(1 + ((this.MinWidth * iButtonCount) / this.Width));
}
}
Таким образом, это позволяет WPF управлять растяжением, как в ответе Нира, но позволяет вам явно настраивать количество строк. Приведенный выше код дает такой результат:
(Анимированный образец здесь )
Обновление 2009/08/28:
Я настраивал свое обучающее приложение так, чтобы ItemsControl
находился в шаблоне данных
в отдельном ResourceDictionary
. Однако такие события, как Loaded
, не могут быть обработаны во внешнем XAML-файле ResourceDictionary
, поскольку в нем нет кода программной части (обычно). Поэтому мне нужно было кэшировать ссылку на UniformGrid
, используя другую технику.
Вместо этого я использовал метод Алана Хей FindItemsPanel
(10-й ответ) . Сначала я заменил ItemsControl
на:
<ContentPresenter x:Name="contentpresenterButtons" Content="{Binding obscolButtons}" />
Затем в моем ResourceDictionary
я поместил ItemsControl
в DataTemplate
:
<DataTemplate DataType="{x:Type local:Buttons}">
<ItemsControl ...
</DataTemplate>
В заключение,