Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在wpf模板中允许变量?_Wpf_Triggers_Controltemplate - Fatal编程技术网

如何在wpf模板中允许变量?

如何在wpf模板中允许变量?,wpf,triggers,controltemplate,Wpf,Triggers,Controltemplate,我有三个按钮,它们只在显示的文本、传递给命令的参数和在图像触发器中比较的值上有所不同。有没有办法将其合并到一个模板中以消除所有重复的XAML 样式定义: <Style TargetType="{x:Type Button}" x:Key="myGridHeaderButton"> <Setter Property="Background" Value="Blue" /> <Setter Property="HorizontalContentAlignment

我有三个按钮,它们只在显示的文本、传递给命令的参数和在图像触发器中比较的值上有所不同。有没有办法将其合并到一个模板中以消除所有重复的XAML

样式定义:

<Style TargetType="{x:Type Button}" x:Key="myGridHeaderButton">
  <Setter Property="Background" Value="Blue" />
  <Setter Property="HorizontalContentAlignment" Value="Stretch" />
  <Setter Property="Foreground" Value="White" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Border Background="{TemplateBinding Background}" BorderThickness="0,0,1,0" BorderBrush="white">
          <ContentPresenter Margin="1" />
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="Background" Value="LightBlue" />
    </Trigger>
  </Style.Triggers>
</Style>

按钮声明:

<Button Grid.Column="2" Style="{StaticResource myGridHeaderButton}" Command="{Binding Path=ColumnHeaderClickCommand}" CommandParameter="Description">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" />
      <ColumnDefinition Width="1" />
      <ColumnDefinition Width="20" />
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0" Text="Custodian" Margin="3,0,0,0" />
    <Image Grid.Column="2" Width="16" Height="16">
      <Image.Style>
        <Style TargetType="{x:Type Image}">
          <Setter Property="Source" Value="/Resources/Sort.Unsorted.png" />
          <Style.Triggers>
            <MultiDataTrigger>
              <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=SortAscending}" Value="True" />
                <Condition Binding="{Binding Path=SortColumn}" Value="Description" />
              </MultiDataTrigger.Conditions>
              <MultiDataTrigger.Setters>
                <Setter Property="Source" Value="/Resources/Sort.Ascending.png" />
              </MultiDataTrigger.Setters>
            </MultiDataTrigger>
            <MultiDataTrigger>
              <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=SortAscending}" Value="False" />
                <Condition Binding="{Binding Path=SortColumn}" Value="Description" />
              </MultiDataTrigger.Conditions>
              <MultiDataTrigger.Setters>
                <Setter Property="Source" Value="/Resources/Sort.Descending.png" />
              </MultiDataTrigger.Setters>
            </MultiDataTrigger>
          </Style.Triggers>
        </Style>
      </Image.Style>
    </Image>
  </Grid>
</Button>

我认为命令和CommandParameter的声明与现在一样。如果只是文字上的差异,我认为只要把
放在正确的位置就行了,但是图像中嵌入了一种样式,它有两个基于不同值的触发器,我不知道如何将所有这些内容移动到模板中,并且仍然能够定义不同的触发器值

在这种情况下,所讨论的触发器值始终与CommandParameter值匹配。。。我会不会一定要这么做

谢谢


J

您可以为附加值编写几个附加属性,并执行TemplateBinding以从模板内部访问它们。另一个选项是带有附加依赖属性的按钮子类。@EdPlunkett我必须对创建附加属性等做一些研究。但是在触发器条件下,您将如何引用它?在条件的值中使用绑定或TemplateBinding似乎不起作用。编译器抱怨绑定无效。您能提供一个您建议的示例吗?在这种情况下,可能需要编写一个多值转换器。可能答案与此相关。您可以为附加值编写两个附加属性,并执行模板绑定以从模板内部访问它们。另一个选项是带有附加依赖属性的按钮子类。@EdPlunkett我必须对创建附加属性等做一些研究。但是在触发器条件下,您将如何引用它?在条件的值中使用绑定或TemplateBinding似乎不起作用。编译器抱怨绑定无效。你能提供一个你建议的例子吗?在这种情况下,可能需要编写一个多值转换器。也许答案是相关的。