【问题标题】:ListBox or ItemControl items don't take up all available spaceListBox 或 ItemControl 项目不占用所有可用空间
【发布时间】:2012-02-15 03:36:35
【问题描述】:

对不起,如果之前已经回答过;我在这里查看过类似的帖子,但建议的修复方法对我不起作用。

我正在从事 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 使用不同的 DataTemplate。

ListBox 似乎忽略了样式属性 Horizo​​ntalContentAlignment,即我无法让项目拉伸到 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>

【问题讨论】:

    标签: wpf silverlight


    【解决方案1】:

    您应该只使用GridStackPanel 仅使用每个元素所需的最小空间。

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

    【讨论】:

    • 这与 wdavo 建议在模板选择器中设置对齐方式相结合。
    • 只是一个问题.. 如果我有这样的情况,当我输入的文本超出框可以处理的范围时,文本框会展开。它吃掉了我的文本块的一半。有没有办法明确告诉网格将每个项目设置为使用一半的空间?
    • 文本块不是先出现的吗?所以文本框正在向后扩展?无论哪种方式,我发布的答案都不应该让这种情况发生。您可能想将此作为一个不同的问题提出。
    • 实际上,如果文本框的水平对齐设置为Stretch,它可能会这样做。如果是,请尝试将其设置为其他内容。
    • 是的,文本块向后扩展,这意味着如果没有足够的空间,文本框会随着文本块变大而变小。我会尝试将文本框的水平对齐设置为不同的值.. :)
    【解决方案2】:

    我猜您需要将 Horizo​​ntalAlignment 和 Horizo​​ntalContentAlignment 属性设置为在您的 TemplateSelector 中拉伸。

    例如

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

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

    【讨论】:

    • 感谢您的回答。我应该把这个 ContentPresenter 对象放在哪里?它是我的 DataTemplate 选择器的孩子吗?还是父母?
    • 我认为您只需将 Horizo​​ntalAlignment 和 Horizo​​ntalContentAlignment 属性添加到您的
    • 谢谢,这成功了。 (将 Horizo​​ntalAlignment 和 Horizo​​ntalContentAlignment 添加到 TemplateSelector 并使用 Grid 而不是 StackPanel。使用 StackPanel 不起作用。
    猜你喜欢
    • 2020-11-03
    • 2014-01-05
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多