2012-02-15 63 views
2

對不起,如果這之前已被回答;我在這裏看過類似的帖子,但建議的修復程序不適合我。ListBox或ItemControl項不佔用所有可用空間

我工作的一個Silverlight 3的項目,我有以下幾點:

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

列表框綁定到一個源,它使用不同的DataTemplates使用DataTemplateSelector我在Silverlight中實現。

ListBox似乎忽略樣式屬性Horizo​​ntalContentAlignment,即我無法讓項目拉伸到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

我猜你需要設置的Horizo​​ntalAlignment和Horizo​​ntalContentAlignment屬性您TemplateSelector內伸展。

E.g.

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

如前所述,你應該還你一個網格,而不是一個StackPanel

+0

感謝您的回答。我在哪裏放這個ContentPresenter對象?它是我的DataTemplate選擇器的孩子嗎?或父母? – krebstar 2012-02-15 04:02:32

+0

我認爲你只需要將Horizo​​ntalAlignment和Horizo​​ntalContentAlignment屬性添加到你的 wdavo 2012-02-15 04:04:07

+1

謝謝,這個伎倆。 (將Horizo​​ntalAlignment和Horizo​​ntalContentAlignment添加到TemplateSelector中,並使用Grid而不是StackPanel。使用StackPanel不起作用 – krebstar 2012-02-15 04:10:54

4

你應該只使用一個GridStackPanel僅使用每個元素所需的最小空間。

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

將嘗試此操作.. – krebstar 2012-02-15 04:04:36

+0

這與wdavo的建議結合在模板選擇器中設置對齊。 – krebstar 2012-02-15 04:11:27

+0

Just一個問題..如果我有這樣的話,當我輸入更多的文本比文本框可以處理的文本框擴展。它吃我的文本塊的一半..有沒有一種方法來明確告訴網格設置每個項目使用一半的空間? – krebstar 2012-02-15 04:32:57