You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让设计器显示用户控件依赖属性的字典定义Brush效果?

问题分析

运行时正常但设计器显示透明的核心原因是:设计器环境下Application.Current可能未完成初始化,或目标资源字典尚未加载,导致依赖属性元数据中Application.Current.Resources["PrimarySolidColorBrush"]返回null,最终BorderBrush使用默认的透明值。

解决方案

以下是几种可靠的修复方式,按推荐优先级排序:

1. 在XAML中直接指定默认值(最推荐)

放弃在C#代码中硬编码默认资源引用,改为在自定义UserControl的XAML根元素上通过StaticResource设置默认值:

<UserControl x:Class="YourNamespace.CustomUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:YourNamespace"
             local:CustomUserControl.CustomBrush="{StaticResource PrimarySolidColorBrush}">
    <!-- 控件内容 -->
</UserControl>

同时修改依赖属性的元数据,移除直接的资源获取逻辑:

public static DependencyProperty CustomBrushProperty =
    DependencyProperty.Register(
        nameof(CustomBrush),
        typeof(Brush),
        typeof(CustomComboBox),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));

设计器能直接解析XAML中的StaticResource,只要资源字典已正确合并(比如在App.xaml或当前UserControl的Resources中合并),就能正常显示画刷效果。

2. 设计器环境下手动加载资源

如果必须在C#代码中设置默认值,可通过DesignerProperties判断当前是否处于设计器模式,手动加载资源字典:

using System.ComponentModel;
using System.Windows;
using System.Windows.Media;

public class CustomComboBox : UserControl
{
    private static Brush GetDefaultCustomBrush()
    {
        if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
        {
            // 设计器环境下,手动加载目标资源字典
            var resourceDict = new ResourceDictionary
            {
                Source = new Uri("/YourAssemblyName;component/Styles.xaml", UriKind.Relative)
            };
            return resourceDict["PrimarySolidColorBrush"] as Brush;
        }
        else
        {
            return Application.Current.Resources["PrimarySolidColorBrush"] as Brush;
        }
    }

    public static DependencyProperty CustomBrushProperty =
        DependencyProperty.Register(
            nameof(CustomBrush),
            typeof(Brush),
            typeof(CustomComboBox),
            new FrameworkPropertyMetadata(GetDefaultCustomBrush()));

    public Brush CustomBrush
    {
        get => (Brush)GetValue(CustomBrushProperty);
        set => SetValue(CustomBrushProperty, value);
    }
}

注意替换YourAssemblyName为你的程序集名称,确保资源路径正确。

3. 确保资源字典在设计器中可访问

将Styles.xaml合并到自定义UserControl的资源字典中,让设计器能直接找到资源:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/YourAssemblyName;component/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

之后依赖属性的默认值可改为null,设计器会通过XAML的资源查找逻辑自动获取PrimarySolidColorBrush。


内容的提问来源于stack exchange,提问作者user11719716

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:22:12