需求描述
在
WPF应用程序中,有时需要根据配置文件中的变量动态调整UI的显示。例如,根据配置文件中的布尔值决定某个控件是否可见。方式有许多,在这里我们介绍的是使用ObjectDataProvider将配置文件中的变量绑定到 WPF 控件的属性,并通过MultiDataTrigger实现复杂的条件逻辑。
实现步骤
1.配置文件
<appSettings>
<add key="IsShowFQIcon" value="true" />
</appSettings>
2.创建资源提供类
using System;
using System.Configuration;
namespace STC.Common.Utils
{
public class LocalEnvResource
{
public bool GetIsShowFQIcon()
{
return LocalEnv.GetAppSettingValue<bool>("IsShowFQIcon", true);
}
}
public static class LocalEnv
{
public static T GetAppSettingValue<T>(string name, T defaultValue)
{
var settingValue = ConfigurationManager.AppSettings[name];
if (string.IsNullOrEmpty(settingValue))
{
return defaultValue;
}
switch (typeof(T).Name.ToLower())
{
case "int32":
return (T)(object)int.Parse(settingValue);
case "boolean":
return (T)(object)bool.Parse(settingValue);
default:
return (T)(object)settingValue;
}
}
}
}
3.在 XAML 中定义 ObjectDataProvider
<UserControl x:Class="Demo.MainUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:config="clr-namespace:Demo.Common.Utils;assembly=Demo.Common">
<UserControl.Resources>
<ObjectDataProvider x:Key="ConfigProvider" ObjectType="{x:Type config:LocalEnvResource}" MethodName="GetIsShowFQIcon" />
</UserControl.Resources>
<Grid>
<Image Name="fqInconImg" Source="path/to/icon.png" Visibility="Collapsed">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding OnLine}" Value="4" />
<Condition Binding="{Binding Source={StaticResource ConfigProvider}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Visible" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Grid>
</UserControl>