首页 文章

ListBox或ItemControl项不占用所有可用空间

提问于
浏览
2

对不起,如果之前已经回答过;我在这里看了类似的帖子,但建议的修复程序对我不起作用 .

我正在开发一个Silverlight 3项目,我有以下内容:

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

ListBox绑定到一个源,它使用我在Silverlight中实现的DataTemplateSelector使用不同的DataTemplates .

ListBox似乎忽略了样式属性HorizontalContentAlignment,即我无法将项目拉伸到ListBox的整个宽度 .

我的DataTemplates看起来像这样:

<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 回答

  • 2

    我猜你需要将HorizontalAlignment和HorizontalContentAlignment属性设置为在TemplateSelector中拉伸 .

    例如 .

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

    如前所述,您还应该使用Grid而不是StackPanel

  • 4

    你应该只使用 Grid . StackPanel 仅使用每个元素所需的最小空间 .

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*">
            <ColumnDefinition Width="*">
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding DisplayName}" />
        <TextBox Text="{Binding Value}" Name="{Binding ID}"/>
    </Grid>
    

相关问题