Кнопка изображения в коде C# позади

Я пытаюсь установить фоновое изображение в коде программной части. Я пытался добавить фоновое изображение на кнопку, но как только я наводил курсор на кнопку, изображение исчезало. Чтобы решить эту проблему, мне нужно написать функции, переопределяющие поведение кнопки, что слишком сложно для кода программной части.

Затем я использую альтернативный метод, то есть добавляю кнопку и изображение отдельно в ячейку сетки. Проблема в том, что когда я нажимаю на изображение, кнопка не срабатывает.

Как сделать так, чтобы кнопка имела эффект наведения и нажатия, даже когда мышь либо наводит курсор, либо нажимает на изображение на кнопке, но не на оставшуюся область кнопка?

Или надеюсь, что кто-то может предложить мне лучшее решение. Ниже приведен мой код.

        InitializeComponent();
        Button playBtn = new Button();
        playBtn.Width = 60;
        playBtn.Height = 30;
        Image playIcon = new Image();
        playIcon.Source = new BitmapImage(new Uri(@"PATH"));
        playIcon.Stretch = Stretch.Uniform;
        playIcon.Height = 25;

        grid1.Children.Add(playBtn);
        grid1.Children.Add(playIcon);

        Grid.SetColumn(playBtn, 0);
        Grid.SetRow(playBtn, 0);
        Grid.SetColumn(playIcon, 0);
        Grid.SetColumn(playIcon, 0);

спасибо всем за участие, после того, как я покопался в этом, это вроде как сработало. Что я сделал, так это добавил Grid в Button.Content, а затем добавил изображение в Grid. И используйте Opacity, чтобы добавить эффект серого для ложного состояния IsEnable. Ниже я размещаю свой код, надеюсь, кто-то найдет его полезным или улучшит:

    Button playBtn = new Button();
    Image playIcon = new Image();

    public MainWindow()
    {
        InitializeComponent();

        Grid grid2 = new Grid();
        RowDefinition grid2_row1 = new RowDefinition();
        ColumnDefinition grid2_col1 = new ColumnDefinition();
        grid2.RowDefinitions.Add(grid2_row1);
        grid2.ColumnDefinitions.Add(grid2_col1);

        playBtn.Width = 60;
        playBtn.Height = 30;
        playBtn.Click += playBtn_Click;

        playIcon.Source = new BitmapImage(new Uri(@"pack://PATH..."));
        playIcon.Stretch = Stretch.Uniform;
        playIcon.Height = 25;

        playBtn.Content = grid2;
        grid2.Children.Add(playIcon);

        grid1.Children.Add(playBtn);

        Grid.SetRow(playIcon, 0);
        Grid.SetColumn(playIcon, 0);
    }

    public void playBtn_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Hello");
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        playBtn.IsEnabled = false;
        playIcon.Opacity = 0.3;
    }

person KMC    schedule 22.03.2011    source источник


Ответы (2)


Проверьте ссылки ниже

http://blogs.msdn.com/b/knom/archive/2007/10/31/wpf-control-development-3-ways-to-build-an-imagebutton.aspx

http://www.hardcodet.net/2009/01/create-wpf-image-button-through-attached-properties

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/91df562f-414c-4326-ac65-42ef301b5f8f/

person biju    schedule 22.03.2011

Кнопки в WPF имеют разные состояния = «нормальное», «наведение мыши» и «нажатие» — три.

Когда вы создаете кнопку, вы настраиваете ее «нормальное» состояние. Вам также необходимо установить состояние «наведение мыши», чтобы иметь такое же изображение.

person ChrisF    schedule 22.03.2011
comment
Как связать состояние mouse_over изображения с состоянием mouse_over кнопки? - person KMC; 22.03.2011
comment
@KMC - у меня есть код, который делает это дома, я посмотрю, смогу ли я его выкопать и опубликовать позже сегодня. - person ChrisF; 22.03.2011
comment
@ChrisF - спасибо, это будет очень полезно. Другая моя проблема заключается в том, что если бы я получил тот же эффект кнопки при наведении или нажатии на изображение на кнопке, мне нужно было бы переписать то же самое событие состояния Normal, Mouse_Over и Presses, которое имеет кнопка по умолчанию. Или я могу наследовать класс событий мыши по умолчанию в моем новом классе событий мыши? - person KMC; 22.03.2011
comment
@KMC - есть разные способы сделать это. Один из них — отредактировать код шаблона кнопки в XAML. Вы не должны дублировать код. - person ChrisF; 22.03.2011
comment
@ChrisF - и кнопка, и изображение генерируются во время выполнения. Нет XAML для работы. С кодом позади я понятия не имею, какой шаг мне следует предпринять. - person KMC; 22.03.2011
comment
@KMC - ОК - мне нужно проверить свой код, когда я вернусь домой, чтобы узнать, применим ли он или может быть изменен в ваших обстоятельствах. - person ChrisF; 22.03.2011
comment
@ChrisF - я отредактировал свой вопрос с решением. Дайте мне знать, если это можно улучшить или есть проблемы с этим. - person KMC; 22.03.2011