Button コントロールに基づいて、簡単なカスタム ImageButton コントロールを作成しました。アイデアは、マウスダウン画像とマウスアップ画像を提供し、マウスの左ボタンのアクションに応じて画像が交換されるというものです。MouseLeftButtonDown イベントは問題なく発生し、画像は更新されますが、MouseLeftButtonUp イベントは発生しません。
これには理由がありますか、間違って実装していますか?
カスタム コントロール:
namespace Reader.Controls
{
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Imaging;
[TemplatePart(Name = "PART_Image", Type = typeof(Image))]
public class ImageButton : Button
{
public Image PartImage;
public ImageButton()
{
this.DefaultStyleKey = typeof(ImageButton);
}
public override void OnApplyTemplate()
{
this.PartImage = this.GetTemplateChild("PART_Image") as Image;
if (this.PartImage != null)
{
this.PartImage.MouseLeftButtonDown += this.PartImageOnMouseLeftButtonDown;
this.PartImage.MouseLeftButtonUp += this.PartImageOnMouseLeftButtonUp;
this.SetImageSource(OffImageSource);
}
}
#region Dependency properties
public byte[] OffImageSource
{
get
{
return (byte[])this.GetValue(OffImageProperty);
}
set
{
this.SetValue(OffImageProperty, value);
}
}
public static DependencyProperty OffImageProperty = DependencyProperty.Register(
"OffImageSource", typeof(byte[]), typeof(ImageButton), new PropertyMetadata(null));
public byte[] OnImageSource
{
get
{
return (byte[])this.GetValue(OnImageProperty);
}
set
{
this.SetValue(OnImageProperty, value);
}
}
public static DependencyProperty OnImageProperty = DependencyProperty.Register(
"OnImageSource", typeof(byte[]), typeof(ImageButton), new PropertyMetadata(null));
#endregion
#region Button events
private void PartImageOnMouseLeftButtonDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
{
if (this.PartImage != null)
{
this.SetImageSource(OnImageSource);
}
}
private void PartImageOnMouseLeftButtonUp(object sender, MouseButtonEventArgs mouseButtonEventArgs)
{
if (this.PartImage != null)
{
this.SetImageSource(OffImageSource);
}
}
#endregion
private void SetImageSource(byte[] imageSource)
{
using (var ms = new MemoryStream(imageSource, 0, imageSource.Length - 1))
{
var bi = new BitmapImage();
bi.SetSource(ms);
this.PartImage.Source = bi;
}
}
}
}
デフォルトのスタイル テンプレート:
<Style TargetType="Controls:ImageButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Controls:ImageButton">
<Image x:Name="PART_Image" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用法:
<Controls:ImageButton x:Name="btnLangEn" Click="btnLangEn_Click" />
使用コード ビハインド (ImageLibrary はリソース ファイルへの参照です):
public LanguageSelection()
{
InitializeComponent();
btnLangEn.OffImageSource = ImageLibrary.LangEn_off;
btnLangEn.OnImageSource = ImageLibrary.LangEn_on;
}
private void btnLangEn_Click(object sender, RoutedEventArgs e)
{
// handle click event here
}