按钮使用依赖项属性为每个状态的单独图像

时间:2014-07-28 23:03:56

标签: c# wpf button dependency-properties

我有一个Button控件,我希望能够在整个项目中重复使用。每次按钮进入新状态时,将显示不同的图像。目前,我有Normal StatePressed State

这是控件的XAML部分:

<Button
    x:Class="customImageButton.ImageButton"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Button.Template>
      <ControlTemplate TargetType="{x:Type Button}">
         <Grid>
            <ContentControl Width="80">
                <Grid>
                    <Image Name="Normal" Source="{Binding NormalState}"/>
                    <Image Name="Pressed" Source="{Binding PressedState}" Visibility="Hidden"/>
                </Grid>
            </ContentControl>
         </Grid>
         <ControlTemplate.Triggers>
            <Trigger Property="IsPressed" Value="True">
               <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/>
               <Setter TargetName="Pressed" Property="Visibility" Value="Visible"/>
            </Trigger>
         </ControlTemplate.Triggers>
      </ControlTemplate>
   </Button.Template>
</Button>

这是控件的代码隐藏:

namespace customImageButton
{
    public partial class ImageButton : Button
    {
        public ImageButton()
        {
            this.InitializeComponent();
        }

        public ImageSource NormalState
        {
            get { return base.GetValue(NormalStateProperty) as ImageSource; }
            set { base.SetValue(NormalStateProperty, value); }
        }

        public static readonly DependencyProperty NormalStateProperty =
            DependencyProperty.Register("NormalState", typeof(ImageSource), typeof(ImageButton));

        public ImageSource PressedState
        {
            get { return base.GetValue(PressedStateProperty) as ImageSource; }
            set { base.SetValue(PressedStateProperty, value); }
        }

        public static readonly DependencyProperty PressedStateProperty =
            DependencyProperty.Register("PressedState", typeof(ImageSource), typeof(ImageButton));
    }
}

......这是它的用途:

<local:ImageButton Content="CustomButton" HorizontalAlignment="Left" 
                   VerticalAlignment="Top" NormalState="Resources/Normal.png"
                   PressedState="Resources/Pressed.png"/>

我的问题是我提供的图像没有显示。两张图片的Build Action均为Resource,我尝试使用绝对路径;但是,这提供了相同的结果。我错过了什么?

1 个答案:

答案 0 :(得分:1)

列出的代码有两个问题:

  1. 绑定需要为TemplateBinding
  2. TargetType应该引用&#34; ImageButton&#34;类型,而不是Button
  3. 像这样:

    <ControlTemplate 
         xmlns:local="clr-namespace:customImageButton"
         TargetType="{x:Type local:ImageButton}">
         <Grid>
            <ContentControl Width="80">
                <Grid>
                    <Image Name="Normal" Source="{TemplateBinding NormalState}"/>
                    <Image Name="Pressed" Source="{TemplateBinding PressedState}" Visibility="Hidden"/>
                </Grid>
            </ContentControl>
         </Grid>
    

    注意:上面的构建和运行,但Visual Studio抱怨:

      

    &#39;的ImageButton&#39; ControlTemplate TargetType与模板类型&#39; Button&#39;

    不匹配

    我建议将控件模板放在Themes/Generic.xaml资源字典中的自己的Style中,而不是内联。