WPF自动化的UIElements

问题描述 投票:1回答:1

我正在努力在我的WPF应用程序中实现操纵杆。我想模拟点击按钮。我可以使用下面的代码运行事件,但我还想显示在UI中单击的按钮。这对于按钮和其他UI项目是否可行?

 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];

c# wpf
1个回答
1
投票

我想到的唯一一件事是,如果我在你的位置,我只需在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接口,
  • 确保您的按钮模板可以到达我们创建属性的datacontext,例如我将RelativeSource设置为Window祖先类型,我觉得这不是真正的nessecary。你可能会做得更好更快。

如果有一个更好的解决方案来提高UI元素的视觉状态,我想知道它!亲切的问候。

© www.soinside.com 2019 - 2024. All rights reserved.