Протяжение средств управления для заполнения ItemsControl

сайт Документации Apache имеет хорошее введение в использование mod_rewrite.

Это покрывает, как директива работает и имеет довольно много примеров, например:

RewriteRule ^/games.* /usr/local/games/web
RewriteRule ^/product/(.*)/view$ /var/web/productdb/$1

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

апачские документы всегда были полезны для меня. O'Reilly Apache: Полное руководство является также хорошим физическим ресурсом.

22
задан Nathan Tuggy 20 June 2015 в 01:51
поделиться

3 ответа

Замените панель управления элементом на UniformGrid, это изменит размер всех дочерних элементов, чтобы все соответствовало точно:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
55
ответ дан 29 November 2019 в 03:57
поделиться
<!-- 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;
    }
}
0
ответ дан 29 November 2019 в 03:57
поделиться

На основе ответа Нира я смог выполнить свой необязательный критерий, разрешающий растягивание нескольких строк под управлением 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 управлять растяжением, как в ответе Нира, но позволяет вам явно настраивать количество строк. Приведенный выше код дает такой результат:

alt text

(Анимированный образец здесь )


Обновление 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>

В заключение,

2
ответ дан 29 November 2019 в 03:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: