创建仅适用于设计时的属性

13

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

创建用户控件时我使用了两个很棒的属性:

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

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


Foreground 是由 DynamicResource 设置的吗? - fahimalizain
是的,背景在mainwindow上。我正在处理用户控件,它没有背景。 - Tono Nam
那么根据你的主题,你是如何设置字体颜色的呢? - fahimalizain
一个选项是更改Cider - ArtboardBackground,可以在这里查看:http://www.wrightfully.com/changing-visual-studio-2012-xaml-designer-background/。我不得不在编辑器上检查“显示所有元素”按钮。 - sous2817
3个回答

23

我不确定这是否完全符合您的要求,但我所做的就是在app.xaml中插入一个触发器来使用IsInDesignMode属性进行调用,例如:

命名空间(感谢Tono Nam);

xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework"

XAML;

<Style TargetType="{x:Type UserControl}">
    <Style.Triggers>
        <Trigger Property="ComponentModel:DesignerProperties.IsInDesignMode"
                 Value="True">
            <Setter Property="Background"
                    Value="#FFFFFF" />
        </Trigger>
    </Style.Triggers>
</Style>

简单有效,有时候我也会根据需要瞄准其他依赖属性,比如字体等。希望这可以帮到你。

补充一下 - 你也可以用同样的方法针对其他TargetType和它们自己的属性,比如ChildWindows、Popups、Windows,等等...


1
这可以用于设计模式下的任何样式!喜欢你的回答,谢谢! - Tono Nam
7
如果有人没有安装 ReSharper,但需要知道 ComponentModel 的命名空间,这里是它的代码:xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework" - Tono Nam
3
对于遇到奇怪的“此命名空间不是有效的XAML”错误的人 - 首先,删除命名空间声明和样式,然后将命名空间声明粘贴为上面的原样,从中删除“;assembly=PresentationFramework”部分,然后添加样式并将“;assembly=PresentationFramework”部分重新添加到命名空间中。这似乎是一种类似于魔法的解决方案,但可以解决此错误。 - a''
@erem 嗯,这个有点奇怪。很高兴你能分享一个解决方法! - Chris W.

4
您可以创建一个带有附加属性的静态类来进行设计模式操作:
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>

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

1

在2022年,你实际上可以做到并且几乎猜到了:


d:Background="White"

请注意,您可以在控件属性前加上d:来为设计时设置其他控件属性,例如:


<TextBlock Text="{Binding TextFromViewModel}"
           Foreground="{StaticResource PrimaryBrush}"
           d:Text="Design-time text"
           d:Foreground="Black" />

来源:在Visual Studio的XAML设计器中使用设计时数据


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接