2009-12-27 77 views
0

我最近一直在玩WPF和我遇到了一些我无法解决的问题。我的generic.xaml中有以下代码:WPF绑定和转换器

<Style TargetType="{x:Type local:ClearButton}">  
    <Style.Resources> 
     <con:ValueConverter x:Key="converter" /> 
    </Style.Resources> 
    <Setter Property="Width" Value="20" /> 
    <Setter Property="Height" Value="20" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ClearButton}"> 
       <Grid> 

        <Image Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
         <Image.Style> 
          <Style TargetType="{x:Type Image}"> 
           <Setter Property="Source" Value="/WPF-Libraries;component/Resources/ClearEnabled.png" /> 
           <Style.Triggers> 

            <Trigger Property="IsMouseOver" Value="True"> 
             <Setter Property="BitmapEffect"> 
              <Setter.Value> 
               <OuterGlowBitmapEffect Opacity="0.5" GlowColor="Red" GlowSize="3" /> 
              </Setter.Value> 
             </Setter> 
            </Trigger> 

            <Trigger Property="IsEnabled" Value="False"> 
             <Setter Property="Source" 
               Value="/WPF-Libraries;component/Resources/ClearDisabled.png" /> 
            </Trigger> 

            <!--Binding #1--> 
            <Trigger Property="{TemplateBinding local:ClearButton.IsPressed}" Value="True"> 
             <Setter Property="RenderTransform"> 
              <Setter.Value> 
               <!--Binding #2--> 
               <ScaleTransform CenterX="CONVERTER BINDING:PASS WIDTH TO CONVERTER" CenterY="CONVERTER BINDING:PASS HEIGHT TO CONVERTER" ScaleX="0.75" ScaleY="0.75" /> 
              </Setter.Value> 
             </Setter> 
            </Trigger> 

           </Style.Triggers>       
          </Style> 
         </Image.Style> 
        </Image> 

        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
        </Border> 

       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

我不能让绑定#1工作。我想将触发器绑定到按钮的IsPressed属性,绑​​定应该是什么?如果我想将按钮的宽度和高度传递给转换器,Binding#2应该绑定什么?

我也可以设置触发这种方式来代替:

<Style TargetType="{x:Type local:ClearButton}"> 
    <Style.Resources> 
     <con:ValueConverter x:Key="converter" /> 
    </Style.Resources> 
    <Setter Property="Width" Value="20" /> 
    <Setter Property="Height" Value="20" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ClearButton}"> 
       <!--Abbreviated--> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

    <Style.Triggers> 
     <!--Binding #1--> 
     <Trigger Property="{TemplateBinding local:ClearButton.IsPressed}" Value="True"> 
      <Setter Property="RenderTransform"> 
       <Setter.Value> 
        <!--Binding #2--> 
        <ScaleTransform CenterX="CONVERTER BINDING" CenterY="CONVERTER BINDING" ScaleX="0.75" ScaleY="0.75" /> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

哪一个更好,会是什么绑定是绑定#1和#2?

回答

1

两种方法都有点不同。你的第一种方法是努力使用绑定到达IsPressed属性,但是Trigger对象的Property属性不是DependencyProperty,所​​以它不支持绑定。

你的第二种方法更接近标记,但仍然错误,再次使用绑定在触发器的属性属性。

检查了这一点,而不是:

<Style TargetType="Button" x:Key="ClearButtonStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid> 
        <TextBlock 
         Name="x" 
         Text="I will change my color when ou press me" 
         TextAlignment="Center" 
         VerticalAlignment="Center" 
         Foreground="Red" 
         TextWrapping="Wrap"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter 
          TargetName="x" 
          Property="Foreground" 
          Value="Green"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

注意,我把触发逻辑上的控制模板级别(指定目标元素),而不是个别元件(在这种情况下的TextBlock)上。

+0

触发器的Property属性? – Austin 2009-12-27 21:53:27

+0

对不起,我遇到了另一个问题。尝试你的方法后,它现在检测用户何时按下按钮,但由于某种原因,转换器不工作。这里是代码: http://snippets.symfony-project.org/snippet/381 CenterX和CenterY似乎等于0.我想这是一个绑定的问题。 – Austin 2009-12-27 22:22:11

+0

当您在未指定源的情况下使用绑定时,默认值是包含绑定的对象的DataContext。您可能希望参考按钮的宽度,但该按钮不是它自己的数据上下文。为了能够引用按钮对象,请将以下内容添加到您的绑定中:'RelativeSource = {RelativeSource Mode = FindAncestor,AncestorType = Button}' – 2009-12-28 09:32:42