Элементы ListBox или ItemControl не занимают все доступное пространство - PullRequest
2 голосов
/ 15 февраля 2012

Извините, если на этот вопрос уже был дан ответ; Я посмотрел подобные посты здесь, но предложенное исправление не работает для меня.

Я работаю над проектом Silverlight 3, и у меня есть следующее:

<ListBox ItemsSource="{Binding}" 
         ItemTemplate="{StaticResource TemplateSelector}"
         >
  <ListBox.ItemContainerStyle>
     <Style TargetType="ListBoxItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
     </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

ListBox привязан к источнику, который использует различные шаблоны данных, используя DataTemplateSelector, который я реализовал в Silverlight.

Кажется, что ListBox игнорирует свойство стиля HorizontalContentAlignment, т.е. я не могу заставить элементы растягиваться на всю ширину ListBox.

Мои шаблоны данных выглядят так:

<StackPanel Orientation="Horizontal">
  <TextBlock Text="{Binding DisplayName}" />
  <TextBox Text="{Binding Value}" Name="{Binding ID}"/>
</StackPanel>

По сути, я хочу, чтобы элементы заполняли все доступное пространство элемента управления ListBox и разделяли их так, чтобы левая половина пространства занимала TextBlock, а правая половина занимала TextBox.

Есть идеи, как это сделать?

РЕДАКТИРОВАТЬ: @wdavo: Вот код TemplateSelector:

// http://www.codeproject.com/Articles/92439/Silverlight-DataTemplateSelector
public abstract class DataTemplateSelector : ContentControl
{
  public virtual DataTemplate SelectTemplate(
    object item, DependencyObject container)
  {
    return null;
  }

  protected override void OnContentChanged(object oldContent, object newContent)
  {

    base.OnContentChanged(oldContent, newContent);
    ContentTemplate = SelectTemplate(newContent, this);
  }
}
public class MyTemplateSelector : DataTemplateSelector
{
  public DataTemplate MyTemplate1 { get; set; }
  public DataTemplate MyTemplate2 { get; set; }
  public DataTemplate MyTemplate3 { get; set; }

  public override DataTemplate SelectTemplate(object item, DependencyObject container)
  {
    var element  = item;

    if (element.GetType() == typeof(MyType1))
      return MyTemplate1;
    else if (element.GetType() == typeof(MyType2))
      return MyTemplate2;
    else if (element.GetType() == typeof(MyType3))
      return MyTemplate3; 

    return base.SelectTemplate(item, container);
  }
}

и xaml:

<DataTemplate x:Key="TemplateSelector">
    <local:MyTemplateSelector Content="{Binding}">
        <local:MyTemplateSelector.MyTemplate1>
            <DataTemplate>
                <StackPanel >
                    <TextBlock Text="{Binding DisplayName}" />
                    <TextBox Text="{Binding Value}" Name="{Binding ID}" />
                </StackPanel>
            </DataTemplate>
        </local:MyTemplateSelector.MyTemplate1>
        ... and so on
    </local:MyTemplateSelector>
</DataTemplate>

Ответы [ 2 ]

4 голосов
/ 15 февраля 2012

Вы должны просто использовать Grid. StackPanel использует только минимальное пространство, необходимое для каждого элемента.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*">
        <ColumnDefinition Width="*">
    </Grid.ColumnDefinitions>
    <TextBlock Text="{Binding DisplayName}" />
    <TextBox Text="{Binding Value}" Name="{Binding ID}"/>
</Grid>
2 голосов
/ 15 февраля 2012

Полагаю, вам нужно установить свойства HorizontalAlignment и HorizontalContentAlignment для растягивания внутри вашего TemplateSelector.

Например,

 <ContentPresenter
            Content="{Binding Item}">
            <ContentPresenter.ContentTemplate>
                <DataTemplate>
                    <local:TemplateSelector
                        Content="{Binding}"
                        HorizontalAlignment="Stretch"
                        HorizontalContentAlignment="Stretch">

Как уже упоминалось, вы также должны использовать Grid вместо StackPanel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...