Wpf 创建仅在设计时应用的特性

Wpf 创建仅在设计时应用的特性,wpf,xaml,designmode,Wpf,Xaml,Designmode,我正在使用VisualStudio黑暗主题。因此,在设计视图时,如果字体为黑色,则无法看到字体。修复方法是将视图背景设置为白色。但是我们的应用程序有不同的主题,所以我不能硬编码 我在创建usercontrol时使用了许多非常好的属性: d:DesignWidth="1110" d:DesignHeight="400" 这些属性仅在设计时影响视图。如果我可以创建一个属性d:DesignBackground,这样我就不必每次运行应用程序时都添加和删除background属性,那就太好了 您可以为设

我正在使用VisualStudio黑暗主题。因此,在设计视图时,如果字体为黑色,则无法看到字体。修复方法是将视图背景设置为白色。但是我们的应用程序有不同的主题,所以我不能硬编码

我在创建usercontrol时使用了许多非常好的属性:

d:DesignWidth="1110" d:DesignHeight="400"

这些属性仅在设计时影响视图。如果我可以创建一个属性
d:DesignBackground
,这样我就不必每次运行应用程序时都添加和删除background属性,那就太好了

您可以为设计模式创建带有附加属性的静态类:

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace Helpers.Wpf
{
    public static class DesignModeHelper
    {
        private static bool? inDesignMode;

        public static readonly DependencyProperty BackgroundProperty = DependencyProperty
            .RegisterAttached("Background", typeof (Brush), typeof (DesignModeHelper), new PropertyMetadata(BackgroundChanged));

        private static bool InDesignMode
        {
            get
            {
                if (inDesignMode == null)
                {
                    var prop = DesignerProperties.IsInDesignModeProperty;

                    inDesignMode = (bool) DependencyPropertyDescriptor
                        .FromProperty(prop, typeof (FrameworkElement))
                        .Metadata.DefaultValue;

                    if (!inDesignMode.GetValueOrDefault(false) && Process.GetCurrentProcess().ProcessName.StartsWith("devenv", StringComparison.Ordinal))
                        inDesignMode = true;
                }

                return inDesignMode.GetValueOrDefault(false);
            }
        }

        public static Brush GetBackground(DependencyObject dependencyObject)
        {
            return (Brush) dependencyObject.GetValue(BackgroundProperty);
        }

        public static void SetBackground(DependencyObject dependencyObject, Brush value)
        {
            dependencyObject.SetValue(BackgroundProperty, value);
        }

        private static void BackgroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (!InDesignMode)
                return;

            d.SetValue(Control.BackgroundProperty, e.NewValue);
        }
    }
}
您可以这样使用它:

xmlns:wpf="clr-namespace:Helpers.Wpf;assembly=Helpers.Wpf"

<Grid Background="Black"
      wpf:DesignModeHelper.Background="White">
    <Button Content="Press me!"/>
</Grid>
xmlns:wpf=“clr命名空间:Helpers.wpf;assembly=Helpers.wpf”

您可以使用此方法来实现设计模式的其他属性。

不确定它是否正是您要查找的,但我所做的只是在app.xaml中弹出一个触发器,以便使用
IsInDesignMode
属性调用,如

名称空间(感谢Tono Nam)

xmlns:componentModel=“clr命名空间:System.componentModel;assembly=PresentationFramework”

XAML


简单但有效,有时我也会根据需要针对其他依赖属性,如字体和其他内容。希望这有帮助


PS-您可以以相同的方式将其他TargetType的属性作为目标,例如,ChildWindows、弹出窗口、Windows等…

是否由DynamicSource设置了前景?是背景,但在主窗口上。我正在处理用户控件,它没有背景。因此,根据您的主题,如何设置FontColor?一个选项是更改苹果酒–ArtboardBackground,请查看此处:。我必须检查编辑器上的“显示所有元素”按钮。这可以用于设计模式中的任何样式!喜欢你的答案,谢谢!如果有人没有resharper,需要知道ComponentModel的名称空间,那么它就是:
xmlns:ComponentModel=“clr名称空间:System.ComponentModel;assembly=PresentationFramework”
对于遇到奇怪问题的人,此名称空间不是有效的xaml错误-首先,删除名称空间声明和样式,然后按上述方式粘贴名称空间声明,删除;按‌​集合=表示f‌​框架部分,然后添加样式并添加;如图所示‌​集合=表示f‌​框架部分返回到名称空间。有点像魔术般的解决方案,但似乎解决了这个bug。@嗯,这是一个奇怪的问题。很高兴你能分享解决方案!
<Style TargetType="{x:Type UserControl}">
    <Style.Triggers>
        <Trigger Property="ComponentModel:DesignerProperties.IsInDesignMode"
                 Value="True">
            <Setter Property="Background"
                    Value="#FFFFFF" />
        </Trigger>
    </Style.Triggers>
</Style>