.NET Core WPF 用户控件设置设计时背景

.NET Core WPF User Control set design-time background

我尝试了 this existing answer 中介绍的两种方法,但均无效。如何设置背景颜色?

方法一

<UserControl x:Class="deletewpf.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:deletewpf"
             mc:Ignorable="d" 
             d:DesignStyle="{StaticResource MyDesignStyle}"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style TargetType="{x:Type Control}" x:Key="MyDesignStyle">
            <Setter Property="Background" Value="White"/>
        </Style>
    </UserControl.Resources>    
    <Grid>
            
    </Grid>
</UserControl>

方法二

<UserControl x:Class="deletewpf.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:deletewpf"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <d:DesignerProperties.DesignStyle>
        <Style TargetType="UserControl">
            <Setter Property="Background" Value="White"/>
        </Style>
    </d:DesignerProperties.DesignStyle>    
    <Grid>
            
    </Grid>
</UserControl>

在出现这些错误之前,我已按 运行 构建它。

这是 .NET Core 设计器的问题。在 .NET Framework 中,这两种方法都有效,但对于第一种方法,您必须使用 DynamicResource,因为样式是在使用后声明的。

d:DesignStyle="{DynamicResource MyDesignStyle}"

.NET Core 有一个解决方法,也包含在其中一个答案中。您必须声明一个定义附加依赖属性的类型,这些属性检查您是否处于 运行 设计模式并设置相应的属性。这只是 Background 属性 的示例,但也可以扩展为使用 Style

public class DesignModeProperties : DependencyObject
{
   public static readonly DependencyProperty BackgroundProperty = DependencyProperty.RegisterAttached(
      "BackgroundProperty", typeof(Brush), typeof(DesignModeProperties),
      new FrameworkPropertyMetadata(Brushes.Transparent, OnBackgroundChanged));

   public static void OnBackgroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {
      if (DesignerProperties.GetIsInDesignMode(d) && d is Control control && e.NewValue is Brush brush)
         control.Background = brush;
   }

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

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

将以下行添加到您的 UserControl 标记以启用设计模式背景。

local:DesignModeProperties.Background="White"