2013-04-25 107 views
2

我有一个以下问题。我想要ListBoxDataTemplateGrid。这个网格有两个两列。我想要设置第一列宽度为3*,另一个为*。这个怎么做?我将复制我的代码。wpf listbox和datatemplate格内

<ListBox x:Name="commandListbox" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="3*" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Column="0" Text="{Binding}"/> 
       <TextBlock Grid.Column="1" Text="icon" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate>     
</ListBox> 
+1

该线程不是很有帮助。目前尚不清楚实际问题是什么。 – shawn1874 2015-02-10 18:26:46

回答

6

更好的存储资源模板:

<Window.Resources> 
    <DataTemplate x:Key="DefaultTemplate"> 
    <Grid x:Name="GridItem" Width="200"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 

     <TextBlock x:Name="Parameter" Grid.Column="1" Text="{Binding Path=Name}" Margin="5,1,0,0" /> 
     <TextBlock x:Name="Value" Grid.Column="2" Text="{Binding Path=Age}" Margin="85,1,0,0" /> 

     <Line x:Name="Separator" X1="0" X2="0" Y1="0" Y2="20" SnapsToDevicePixels="True" Grid.Column="1" Stroke="Black" StrokeThickness="2" Margin="50,0,0,0" HorizontalAlignment="Left" /> 
    </Grid> 
</DataTemplate> 
</Window.Resources> 

ListBox的定义:

<ListBox Name="MyListBox" ItemTemplate="{StaticResource DefaultTemplate}" /> 

在代码的C#:

public class Person 
{ 
    public string Name 
    { 
    get; 
    set; 
    } 

public int Age 
{ 
    get; 
    set; 
} 
} 

定义的ObservableCollection:

在收集个
private ObservableCollection<Person> MyListBoxData = new ObservableCollection<Person>(); 

并添加项目:

MyListBoxData.Add(new Person() 
{ 
    Name = "Nick", 
    Age = 21, 
}); 

MyListBoxData.Add(new Person() 
{ 
    Name = "Adam", 
    Age = 11, 
}); 

MyListBox.ItemsSource = MyListBoxData; 

编辑:

然后设置宽度= “3 *” WIDTH = “*” 和保证金= “ - WidthGrid” 的第一TextBlock的:

<Grid x:Name="GridItem" Width="300"> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="3*" /> 
    <ColumnDefinition Width="*" /> 
</Grid.ColumnDefinitions> 

<TextBlock x:Name="Parameter" Grid.Column="1" Text="{Binding Path=Name}" Margin="-220,0,0,0" /> 
<TextBlock x:Name="Value" Grid.Column="2" Text="{Binding Path=Age}" Margin="0,0,0,0" /> 
</Grid> 
+1

我不想设置常量值或自动。这不是我的问题的答案。我想有2列,其中一个包含3/4的屏幕和另一个1/4。 – MistyK 2013-04-25 11:54:00

3

使用IsSharedSizeScope共享列宽跨产生的网格,用于自动宽度(不能不要E对于*上浆):

通过http://wpftutorial.net/DataTemplates.html

<ListBox ItemsSource="{Binding}" BorderBrush="Transparent" 
    Grid.IsSharedSizeScope="True" 
    HorizontalContentAlignment="Stretch"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid Margin="4"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" SharedSizeGroup="Key" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 
      <TextBox Grid.Column="1" Text="{Binding Value }" /> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

See MSDN remarks

列和参加大小共享行不尊重星上浆。在这种情况下,Star尺寸被视为Auto。 如果IsSharedSizeScope在资源模板中设置为true,并且在该模板外定义了SharedSizeGroup,则网格大小共享不起作用。

1
<ListBox x:Name="commandListbox" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="0.75*" /> 
        <ColumnDefinition Width="0.25*" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Column="0" Text="{Binding}"/> 
       <TextBlock Grid.Column="1" Text="icon" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate>     
</ListBox> 

如果我理解正确的话,你正在寻找第1列3/4的空间和第2列1/4的空间。以上述格式设置宽度必须解决问题。

希望它解决。