2011-12-18 33 views
0

我創建自定義的控制不能結合的圖像源 - 圖像按鈕。目的是讓按鈕沒有任何背景或邊框,只有3個圖像(正常狀態,按下和鼠標懸停)。使用它時 - 所有3個圖像應該是有界的。我從here得到一些代碼,但是源代碼是永久的。我的代碼是某事像那:自定義控件三態的ImageButton,

Generic.xaml:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:JoesControls"> 
<Style TargetType="{x:Type local:ImageButton}" x:Key="styledImageButton"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ImageButton}"> 
       <Grid 
        Margin="{TemplateBinding Control.Padding}" 
        HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
        VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
        SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
        > 
        <Image Name="Normal" Source="{TemplateBinding NormalSource}"/> 
        <Image Name="Pressed" Source="{TemplateBinding PressedSource}" Visibility="Hidden"/> 
        <Image Name="Over" Source="{TemplateBinding MouseOverSource}" Visibility="Hidden"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="Pressed" Property="Visibility" Value="Visible"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="Over" Property="Visibility" Value="Visible"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

而且ImageButton.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace JoesControls 
{ 
    public class ImageButton : Button 
    { 
     static ImageButton() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton))); 
     } 

     #region NormalSourceProperty 

     public static readonly DependencyProperty NormalSourceProperty = 
      DependencyProperty.Register("NormalSource", typeof(ImageSource), typeof(ImageButton), 
      new FrameworkPropertyMetadata(null, 
        FrameworkPropertyMetadataOptions.AffectsRender | 
        FrameworkPropertyMetadataOptions.AffectsParentMeasure)); 

     public ImageSource NormalSource 
     { 
      get { return (ImageSource)GetValue(NormalSourceProperty); } 
      set 
      { 
       SetValue(NormalSourceProperty, value); 
      } 
     } 

     #endregion // NormalSource 

     #region PressedSourceProperty 

    public static readonly DependencyProperty PressedSourceProperty = 
     DependencyProperty.Register("PressedSource", typeof(ImageSource), typeof(ImageButton), 
     new FrameworkPropertyMetadata(null, 
       FrameworkPropertyMetadataOptions.AffectsRender | 
       FrameworkPropertyMetadataOptions.AffectsParentMeasure)); 

    public ImageSource PressedSource 
    { 
     get 
     { 

      if (PressedSource == null || PressedSource.ToString() == String.Empty) 
       SetValue(PressedSourceProperty, NormalSource); 

      return (ImageSource)GetValue(PressedSourceProperty); 
     } 
     set 
     { 
      SetValue(PressedSourceProperty, value); 
     } 
    } 

    #endregion // PressedSource 

    #region MouseOverSourceProperty 

    public static readonly DependencyProperty MouseOverSourceProperty = 
     DependencyProperty.Register("MouseOverSource", typeof(ImageSource), typeof(ImageButton), 
     new FrameworkPropertyMetadata(null, 
       FrameworkPropertyMetadataOptions.AffectsRender | 
       FrameworkPropertyMetadataOptions.AffectsParentMeasure)); 

    public ImageSource MouseOverSource 
    { 
     get 
     { 
      if (MouseOverSource == null || MouseOverSource.ToString() == String.Empty) 
       SetValue(MouseOverSourceProperty, NormalSource); 

      return (ImageSource)GetValue(MouseOverSourceProperty); 
     } 
     set 
     { 
      SetValue(MouseOverSourceProperty, value); 
     } 
    } 

    #endregion // OverSource 

    } 
} 

它編譯沒有錯誤,但顯然是行不通的。來源不受限制。我猜源綁定設置不正確,但我一直在努力了一段時間,google搜索,但我stucked。我感謝任何幫助。

感謝

回答

-1

我忘了,儘管我已經achived我想要的東西的事實的問題。今天,我已經找到了解決,所以我很高興與大家分享您的解決方案:

xaml.cs文件

namespace JoesControls.ImageButton 
{ 
//JoesControls - Controls for WPF 

/// <summary> 
/// Interaction logic for ImageButton.xaml 
/// </summary> 
public partial class ImageButton : Button, INotifyPropertyChanged 
{ 
    public ImageButton() 
    { 
     InitializeComponent(); 
    } 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     this.Ims = NormalSource; 
    } 

    #region NormalSourceProperty 

    public static readonly DependencyProperty NormalSourceProperty = 
     DependencyProperty.Register("NormalSource", typeof(ImageSource), typeof(ImageButton), 
     new FrameworkPropertyMetadata(null, 
       FrameworkPropertyMetadataOptions.AffectsRender | 
       FrameworkPropertyMetadataOptions.AffectsParentMeasure)); 

    public ImageSource NormalSource 
    { 
     get { return (ImageSource)GetValue(NormalSourceProperty); } 
     set 
     { 
      SetValue(NormalSourceProperty, value); 
     } 
    } 

    #endregion // NormalSource 

    #region PressedSourceProperty 

    public static readonly DependencyProperty PressedSourceProperty = 
     DependencyProperty.Register("PressedSource", typeof(ImageSource), typeof(ImageButton), 
     new FrameworkPropertyMetadata(null, 
       FrameworkPropertyMetadataOptions.AffectsRender | 
       FrameworkPropertyMetadataOptions.AffectsParentMeasure)); 

    public ImageSource PressedSource 
    { 
     get 
     { 
      return (ImageSource)GetValue(PressedSourceProperty); 
     } 
     set 
     { 
      SetValue(PressedSourceProperty, value); 
     } 
    } 

    #endregion // PressedSource 

    #region MouseOverSourceProperty 

    public static readonly DependencyProperty MouseOverSourceProperty = 
     DependencyProperty.Register("MouseOverSource", typeof(ImageSource), typeof(ImageButton), 
     new FrameworkPropertyMetadata(null, 
       FrameworkPropertyMetadataOptions.AffectsRender | 
       FrameworkPropertyMetadataOptions.AffectsParentMeasure)); 

    public ImageSource MouseOverSource 
    { 
     get 
     { 
      return (ImageSource)GetValue(MouseOverSourceProperty); 
     } 
     set 
     { 
      if (value == null) 
       SetValue(MouseOverSourceProperty, NormalSourceProperty); 
      else 
       SetValue(MouseOverSourceProperty, value); 
     } 
    } 

    #endregion // OverSource 

    private void Button_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     changeImage(MouseOverSource); 
    } 

    private void Button_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     changeImage(NormalSource); 
    } 

    private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     changeImage(PressedSource); 
    } 

    private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
    { 
     changeImage(MouseOverSource); 
    } 

    private void changeImage(ImageSource newSource) 
    { 
     //ButtonImage.Source = newSource; 
     Ims = newSource; 
    } 

    private ImageSource _ims; 
    public ImageSource Ims 
    { 
     get { return _ims; } 
     set 
     { 
      _ims = value; 
      OnPropertyChanged("Ims"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

}

和XAML文件:

<Button x:Class="JoesControls.ImageButton.ImageButton" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    MouseEnter="Button_MouseEnter" 
    MouseLeave="Button_MouseLeave" 
    PreviewMouseDown="Button_PreviewMouseDown" 
    PreviewMouseUp="Button_PreviewMouseUp" 
    > 
<Button.Style> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Image Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}, Path=Ims}" 
          Margin="{TemplateBinding Control.Padding}" 
          HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
          MinHeight="10"        
          MinWidth="10" 
          /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Button.Style> 

+0

將是很好的發佈一些評論,以幫助別人,我明白了爲什麼這是一個不好回答 – Joe 2014-09-04 13:36:12