Подтвердить что ты не робот

Управление изображением WPF с событием Click

Я хочу использовать <Image> в моем приложении WPF, которое отвечает на щелчки мыши. Только события "Mouse Up" и "Moue Down" доступны из коробки. Я нахожу это довольно особенным. Есть ли способ расширить элемент управления или использовать другой элемент управления, чтобы дать тот же эффект?

4b9b3361

Ответ 1

Чтобы расширить ответ Shawn Mclean, одна из больших возможностей WPF - это способность использовать поведение элемента управления, полностью изменяя внешний вид этого элемента управления. Если вы хотите создать образ, похожий на кнопку (в комплекте с событиями щелчка, привязкой команд, назначением кнопок по умолчанию и т.д.), Вы можете поместить изображение в элемент управления кнопками и восстановить эту кнопку, чтобы удалить кнопку "хром". Это даст вам хороший API кнопки с желаемым внешним видом. Вы можете повторно использовать этот стиль, и этот подход уменьшит необходимость создания обработчиков событий в вашем коде, если у вас есть команды для привязки к вашим новым кнопкам изображения.

Создание такого стиля довольно просто. Просто создайте новый ресурс стиля с именованным ключом в ресурсе и назначьте этот ресурс свойству Style для ваших кнопок. Вот пример, который я собрал вместе:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ButtonStyleTestApp.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">

<Window.Resources>
    <Style x:Key="NoChromeButton" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid x:Name="Chrome" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Grid>
                    <ControlTemplate.Triggers>                          
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="#ADADAD"/>
                            <Setter Property="Opacity" TargetName="Chrome" Value="0.5"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid x:Name="LayoutRoot" Background="#FF44494D">
    <Button Style="{DynamicResource NoChromeButton}" Click="ButtonClicked" >
        <Image Source="Desert.png" Stretch="None"/>
    </Button>
</Grid>
</Window>

Ответ 2

Используйте MouseUp. В любом случае вы не можете вносить вкладки или фокусироваться на элементе управления Image, так что единственный способ щелкнуть по нему.

Другой вариант - просто поместить изображение в кнопку и удалить все стили, отредактировав шаблон управления, чтобы он выглядел просто как изображение. Таким образом, вы можете сосредоточиться на нем с помощью клавиатуры.

Ответ 3

Вы можете использовать набор из 4 обработчиков и 2 булевых переменных:

булевы:

  • IsClicked
  • IsEntered

Обработчики:

  • OnMouseDown - устанавливает IsClicked true;
  • OnMouseEnter- устанавливает значение IsEntered true;
  • OnMouseLeave - устанавливает IsEntered false;
  • OnMouseUp - if (IsClicked && IsEntered) {/TODO ваша логика /}, а затем устанавливает IsClicked false;

Эта конструкция реализует функциональность классического щелчка.

Ответ 4

  1. OnMouseLeave - также установлено isClicked на false; В противном случае вы можете щелкнуть мышью и отпустить мышь. Затем щелкните мышью и отпустите мышь, чтобы сделать щелчок.