【问题标题】:WPF Button Change Image When Background Event Fires触发背景事件时 WPF 按钮更改图像
【发布时间】:2022-02-21 18:11:05
【问题描述】:

一般来说,对 WPF 和 .NET 来说非常陌生。以前我使用的是 winforms 和 VBA,非常基本的东西。

我正在尝试学习如何利用 XAML 和事件。我知道有更好的方法来处理以下情况,但我只想了解基础知识。

假设我有 2 个按钮,连接和断开连接。当窗口加载时,Connect 有 imgConnect,Disconnect 有 imgDisconnect。所有图片都是静态资源

xaml

<Button x:Name="btnToolbarConnect" Content ="{StaticResource imgConnect}" ToolTip="Connect" Foreground="#FFF0F0F0" IsEnabled="True"/>
<Button x:Name="btnToolbarDisconnect" Content ="{StaticResource imgDisabledDisconnect}" ToolTip="Disconnect" Foreground="#FFF0F0F0" IsEnabled="False"/>

当用户按下connect(并成功连接)时,connect上的图像变为imgDisabledConnect,Disconnect变为imgDisabledDisconnect(反之亦然)

cs

 private void SystemSrv_ConnectionStateChanged(object sender, ConnectionStateChangedEventArgs e)
        {
            CheckServiceState();
        }

        
        private bool CheckServiceState()
        {
            try
            {
                
                switch (service.ReadState().State.ToString())
                {
                    case "Connected":
                       
                        return true;

                    case "Disconnected":
                        
                        return false;
                    default:
                        return true;
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
                return false;
            }
        }

过去,我会在 CheckServiceState switch 语句中处理 winform 的 UI 元素 (text1.text.disable),但据我所知,这不是 XAML/WPF 的最佳实践(我也不认为它可以用于按钮内容图片)。

我已经搜索过这里和其他网站,但我唯一能找到的是按钮触发自己的事件并通过 XAML 触发器/样式更改自己的图像。

基本上我问的是,以最基本的方式,当一个不是它自己创建的事件发生时,我如何更改一个按钮上的图像?

一旦我弄清楚了这一点,我将在此事件触发时使用样式并启用/禁用许多 UI 元素。

==============编辑1==============

我试过了,但是按钮内容没有改变。我是否必须将绑定 TriggerTest 关联到其他地方?

<Button x:Name="btnToolbarTcStart" Content = "New" ToolTip="Re/Start TwinCAT System" IsEnabled="False" Click="btnToolbarTcStart_Click">
                        <Button.Style>
                                <Style TargetType="{x:Type Button}">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding TriggerTest}" Value="True">
                                            <Setter Property="Content" Value="{StaticResource TcStart}"/>
                                        </DataTrigger>
                                    <DataTrigger Binding="{Binding TriggerTest}" Value="False">
                                            <Setter Property="Content" Value="{StaticResource TcGrey}"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Button.Style>
                        </Button>

CS

  private bool TriggerTest(bool value)
        {
            Debug.WriteLine(value);
            return value;
        }

【问题讨论】:

标签: xml wpf


【解决方案1】:

基本上我问的是,以最基本的方式,当一个不是它自己创建的事件发生时,我如何更改一个按钮上的图像?

只需像以前一样设置Content 属性即可:

btnToolbarConnect.Content = FindResource("imgDisabledDisconnect");

如果您遵循推荐的 MVVM 设计模式,您通常会绑定到视图模型的属性并使用 DataTrigger 根据其值设置 Content,就像您在编辑中所做的那样。请注意,TriggerTest 必须是Button 的当前DataContext公共属性,这样您的XAML 标记才能按预期工作。

【讨论】:

  • @GeneParmesan:你试过这个还是发生了什么?
猜你喜欢
  • 2016-07-12
  • 2013-04-25
  • 1970-01-01
  • 2016-03-15
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
相关资源
最近更新 更多