DataTemplate中的Grid ColumnDefinition.Width

时间:2011-11-05 10:09:33

标签: wpf xaml grid controltemplate

在我的项目中,我创建了一个继承自Control的控件。它被称为DialogHeader,正如其名称所示,用于在模态,不可调整大小的对话框上显示标题。实际上,它默认绑定到其父Window。该控件具有一个名为IconLocation的属性,即图像是否应显示在控件标签的左侧或右侧:

[Image] [Label] -- or -- [Label] [Image]

DialogHeader使用的模板基本上如下:

<ControlTemplate>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition x:Name="COLN_Left" Width="auto" />
      <ColumnDefinition Width="auto" />
      <ColumnDefinition x:Name="COLN_Right" Width="*" />
    </Grid.ColumnDefinitions>

    <Image Grid.Column="0" Name="PART_Image" />
    <Separator Grid.Column="1"
               Visibility="Collapsed" Width="{TemplateBinding SpacerWidth}" />
    <TextBlock Grid.Column="2" Name="PART_Text" />
  </Grid>
  <ControlTemplare.Triggers>
    <Trigger Property="ImageLocation" Value="Right">
      <Setter TargetName="PART_Image" Property="Grid.Column" Value="2" />
      <Setter TargetName="PART_Text"  Property="Grid.Column" Value="0" />
      <!-- The following doesn't work! Help! -->
      <Setter TargetName="COLN_Left"  Property="Width"       Value="*" />
      <Setter TargetName="COLN_Right" Property="Width"       Value="auto" />
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

简单地说,当ImageLocation属性设置为Location.Right时,应交换COLN_LeftCOLN_Right的宽度。因此,我应该[auto][auto][*]而不是[*][auto][auto]

如何从ControlTemplate开始这项工作?如果没有,是否有办法不涉及使用C#代码?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

那部分确实有效,它可能不是你想要的假设。尝试删除它,结果应该是不同的。