【发布时间】: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;
}
【问题讨论】:
-
1.您不能绑定到方法 (
TriggerTest),只能绑定到属性。创建一个属性 2. 如果您有本地值 (Content="New"),那么样式设置器将无法更改它。所以删除本地价值。最近的例子:stackoverflow.com/questions/71155514/… -
您可以选择在 ViewModel 中加载图像并绑定它们吗?