WPF中 将配置文件中的属性转换为静态资源在XAML中绑定

100 阅读1分钟

需求描述

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>