创建仅适用于设计时的属性
Create properties that only apply on design time
我正在使用 visual studio 深色主题。结果,在设计我的视图时,如果字体是黑色的,我就看不到它。解决方法是将视图的背景设置为白色。但是我们的应用程序有不同的主题,所以我不能硬编码。
我在创建用户控件时使用了很多很棒的属性:
d:DesignWidth="1110" d:DesignHeight="400"
这些属性只影响设计时的视图。如果我可以创建一个 属性 d:DesignBackground
,这样我就不必在每次 运行 应用程序时都添加和删除背景 属性,那就太好了。
您可以为设计模式创建一个带有附加 属性 的静态 class:
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>
您可以使用此方法实现其他 属性 设计模式。
不确定它是否正是您要查找的内容,但我所做的只是在 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>
简单,但有效,有时我也会根据需要定位其他依赖属性,如字体和其他东西。希望这有帮助。
PS - 您可以使用相同的方式将其他 TargetType 定位到它们自己的属性,例如,ChildWindows、Popups、Windows,无论什么...
我正在使用 visual studio 深色主题。结果,在设计我的视图时,如果字体是黑色的,我就看不到它。解决方法是将视图的背景设置为白色。但是我们的应用程序有不同的主题,所以我不能硬编码。
我在创建用户控件时使用了很多很棒的属性:
d:DesignWidth="1110" d:DesignHeight="400"
这些属性只影响设计时的视图。如果我可以创建一个 属性 d:DesignBackground
,这样我就不必在每次 运行 应用程序时都添加和删除背景 属性,那就太好了。
您可以为设计模式创建一个带有附加 属性 的静态 class:
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>
您可以使用此方法实现其他 属性 设计模式。
不确定它是否正是您要查找的内容,但我所做的只是在 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>
简单,但有效,有时我也会根据需要定位其他依赖属性,如字体和其他东西。希望这有帮助。
PS - 您可以使用相同的方式将其他 TargetType 定位到它们自己的属性,例如,ChildWindows、Popups、Windows,无论什么...