2010-01-06 36 views
0

我是一个wpf新手&非常喜欢它。不过,我有一个布局问题,希望有人能帮助我。我需要建立一个人物属性编辑器。这些由2个固定属性组成 - 名字&姓氏,加上其他属性(如年龄,性别等)的可变桶。wpf新手 - 如何布置可变属性集,使它们与固定属性显示在同一列中

我建立了一个对话框,其中包含2个固定属性的文本框和一个列表框可变属性。

<Grid Name="mainGrid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="10"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 

    <Label Grid.Column="0" Grid.Row="0" VerticalAlignment="Center">First Name:</Label> 
    <TextBox Name="tbFirstName" Grid.Column="2" Grid.Row="0" MinWidth="100" Margin="5" Text="{Binding Path=FirstName}"/> 

    <Label Grid.Column="0" Grid.Row="1" VerticalAlignment="Center">Last Name:</Label> 
    <TextBox Name="tbLastName" Grid.Column="2" Grid.Row="1" MinWidth="100" Margin="5" Text="{Binding Path=LastName, UpdateSourceTrigger=PropertyChanged}"/>  

    <ListBox Name="lstAttributes" Grid.Row="2" Grid.ColumnSpan="3" ItemsSource="{Binding Path=Attributes, UpdateSourceTrigger=PropertyChanged}"/> 

    <StackPanel Orientation="Horizontal" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Right"> 
     <Button Name="btnOk" IsDefault="True" Click="btnOk_Click" Grid.Column="0" Grid.Row="2" MinWidth="60" Margin="5">Ok</Button> 
     <Button Name="btnCancel" IsCancel="True" Grid.Column="0" Grid.Row="2" MinWidth="60" Margin="5">Cancel</Button> 
    </StackPanel> 

</Grid> 

我有一个数据层,返回一个绑定的人物件。这包含绑定到列表框的属性列表 。为了支持不同类型的属性,这些属性从一个公共基类中派生。即IntegerAttribute:AttributeBase用来表示'Age'属性。

我然后使用数据模板来呈现取决于属性的类型正确的控制:

<Window.Resources> 
     <DataTemplate DataType="{x:Type reg:IntegerAttribute}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Grid.Column="1" Text="{Binding Name}"/> 
       <TextBox Grid.Column="3" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type reg:TextAttribute}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}"/> 
       <TextBox Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/> 
      </StackPanel>   
     </DataTemplate> 
     <DataTemplate DataType="{x:Type reg:SingleChoiceAttribute}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}"/> 
       <ComboBox ItemsSource="{Binding Path=Choices, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/> 
      </StackPanel> 
     </DataTemplate> 
    </Window.Resources> 

但这里的问题。我希望变量集属性与固定属性出现在相同的列中。我尝试使用SharedSizeGroup,但这似乎不起作用。

非常感谢,

NickD

回答

0

在您的自定义属性数据的模板,而不是使用一个StackPanel,请尝试使用网格3列,如含格,设置IsSharedSizeScope为false在内部网,并在外部网格上为true,并在两个网格上使用SharedGroupSize。

例子:

<Window.Resources> 
    <DataTemplate DataType="{x:Type reg:IntegerAttribute}"> 
     <Grid IsSharedSizeScope="False"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="groupa" Width="*"/> 
       <ColumnDefinition SharedSizeGroup="groupb" Width="10"/> 
       <ColumnDefinition SharedSizeGroup="groupc" Width="*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="1" Text="{Binding Name}"/> 
      <TextBox Grid.Column="3" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"/> 
     </Grid> 
    </DataTemplate> 
... 
<Grid Name="mainGrid" IsSharedSizeScope="True"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition SharedSizeGroup="groupa" Width="*"/> 
     <ColumnDefinition SharedSizeGroup="groupb" Width="10"/> 
     <ColumnDefinition SharedSizeGroup="groupc" Width="*"/> 
    </Grid.ColumnDefinitions> 
... 

你要知道,共享的尺寸组只与汽车宽度列,如果我没记错的话,那么一些上面的例子中的列定义的可能需要更改自动宽度工作。

另一方面,由于没有列是自动宽度,因此您可能不会使用共享组大小,因为列宽无论如何都是匹配的。

以下是一个演示这是一个完整的例子(没有后面所需的代码):

<Window x:Class="gridsh.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <x:ArrayExtension x:Key="data" Type="{x:Type sys:String}"> 
      <sys:String>Test1</sys:String> 
      <sys:String>Test2</sys:String> 
      <sys:String>Test3</sys:String> 
      <sys:String>Test4</sys:String> 
     </x:ArrayExtension> 
     <DataTemplate DataType="{x:Type sys:String}"> 
      <Grid Grid.IsSharedSizeScope="False"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition SharedSizeGroup="groupa" Width="Auto"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 
       <Border BorderBrush="Black" BorderThickness="1"> 
        <TextBlock Text="xxxxxx"/> 
       </Border> 
       <TextBlock Text="{Binding}" Grid.Column="1"/> 
      </Grid> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid Grid.IsSharedSizeScope="True"> 
     <Grid Grid.IsSharedSizeScope="False" Height="30" VerticalAlignment="Top" Margin="3"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="groupa" Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Border BorderBrush="Black" BorderThickness="1"> 
       <TextBlock Text="WWWWWWWWWWWWWWWWWWWWWWW"/> 
      </Border> 
      <TextBlock Text="dgdfsg" Grid.Column="1"/> 
     </Grid> 
     <ListBox ItemsSource="{StaticResource data}" Margin="0,36,0,0" BorderThickness="0" Padding="0"/> 
    </Grid> 
</Window> 
+0

感谢您的答复。我只是尝试了这些更改,不幸的是,这适用于固定宽度的列,它不适用于Auto或*。如果我将第一列或最后一列设置为自动或者*对话框以列对齐的方式正确打开,但最后一列从左向右移动对话框最终消失。任何想法,为什么这可能会发生,假设它每次都在重新绘制列... – NickUk 2010-01-06 13:50:03

+0

我相信这是正确设置IsSharedSizeScope的问题...我会再看看并更新。 – 2010-01-06 14:10:25

+0

谢谢,我已经将mainGrid设置为true,并将数据模板设置为false,如您所建议的那样。 – NickUk 2010-01-06 15:22:59

相关问题