WPF Автоматизация UIElements - PullRequest
       1

WPF Автоматизация UIElements

0 голосов
/ 28 октября 2018

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

 var invokeProv = (IInvokeProvider) (new ButtonAutomationPeer(ButtonHome).GetPattern(PatternInterface.Invoke));
            invokeProv?.Invoke();

 ButtonHome.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));

Я выбрал это как возможное решение.В класс главного окна я положил ...

public static readonly DependencyProperty ButtonPressedProperty =
        DependencyProperty.Register("ButtonPressed", typeof(bool), typeof(MainWindow), new PropertyMetadata(null));

добавил свойство ...

       private bool ButtonPressed
    {
        get => (bool) GetValue(ButtonPressedProperty);
        set => SetValue(ButtonPressedProperty, value);

    }

В главном окне xaml под кнопкой я положил ...

<Button.Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=(windows:MainWindow.ButtonPressed)}" Value="True">
            <Setter Property="Background" Value="{StaticResource PressedButtonBackground}"/>
            <Setter Property="Foreground" Value="{StaticResource ButtonForeground}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=(windows:MainWindow.ButtonPressed)}" Value="False">
            <Setter Property="Background" Value="{StaticResource ButtonBackground}"/>
            <Setter Property="Foreground" Value="{StaticResource ButtonForeground}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Оценивая мои кнопки джойстика, я только что использовал ButtonPressed = gamepadButtons [3];

1 Ответ

0 голосов
/ 29 октября 2018

единственное, что мне приходит в голову, это если бы я был на вашем месте, я просто создал бы триггер данных на стороне xaml следующим образом:

<Button x:Name="btn" Height="30" Margin="0,5,0,0">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Green" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border x:Name="bd"
                                    Background="{TemplateBinding Background}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}">
                                <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" />
                            </Border>
                            <ControlTemplate.Triggers>
                                <DataTrigger Binding="{Binding ButtonPressed, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Value="True">
                                    <Setter TargetName="bd" Property="Background" Value="Purple" />
                                </DataTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Style>
    </Button>

, затем я бы создал свойство:

    private bool _buttonPressed;
    public bool ButtonPressed
    {
        get
        {
            return _buttonPressed;
        }
        set
        {
            if (_buttonPressed != value)
            {
                _buttonPressed = value;
                OnPropertyChanged(nameof(ButtonPressed));
            }
        }
    }

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

        var invokeProv = (IInvokeProvider)(new ButtonAutomationPeer(ButtonHome).GetPattern(PatternInterface.Invoke));
        invokeProv?.Invoke();

        ButtonHome.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
        ButtonPressed = true;

Вещи, о которых вы должны помнить в этом решении:

  • Реализация интерфейса INotifyPropertyChanged,

  • Убедитесь, что ваш шаблон кнопки может получить доступ к тексту данных, где создается наше свойство, например, I 'Я установил RelativeSource для типа предка Window, который, на мой взгляд, не является обязательным.Вы можете сделать это лучше и быстрее.

Если есть лучшее решение для повышения визуального состояния элементов пользовательского интерфейса, я бы хотел узнать об этом!С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...