0

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
}
4

1 に答える 1

0

以下のように、クリック ハンドラーを OnMouseLeftButtonDown と OnMouseLeftButtonUp のオーバーライドされたメソッドに置き換えることで、これを並べ替えました。

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);

        if (this.PartImage != null)
        {
            this.SetImageSource(OnImageSource);
        }
    }

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonUp(e);

        if (this.PartImage != null)
        {
            this.SetImageSource(OffImageSource);
        }
    }

これは、派生クラスでイベントを処理するための推奨される方法です: http://msdn.microsoft.com/en-us/library/system.windows.controls.control.onmouseleftbuttonup(v=vs.95).aspx

于 2012-09-24T15:38:29.980 に答える