WPF中仅设计时背景色?

gpfsuwkq  于 2023-02-25  发布在  其他
关注(0)|答案(5)|浏览(175)

在WPF XAML中,存在方便的DesignHeightDesignWidth,例如在代码中

<UserControl ... d:DesignHeight="500" d:DesignWidth="500" ... />

这很棒,因为我可以用一个“代表性”但“非锁定”的控件大小来构建布局。
然而,我经常构建深色UI,其中标签等需要是白色的,但我的控件仍然需要透明背景色。这造成了设计时的不便,因为白色似乎是设计器中透明控件的默认背景色,导致无法读取白底白字标签。
是否有一种方法或策略可以像DesignHeight/DesignWidth那样方便地设置设计时背景色?

qlvxas9a

qlvxas9a1#

有一个未记录的Style类型的属性d:DesignStyle,您可以在用户控件上设置该属性。此样式仅应用于设计器,不能在运行时使用。
您可以这样使用它:

<UserControl ... d:DesignStyle="{StaticResource MyDesignStyle}" />

或者像这样:

<UserControl ...>
    <d:DesignerProperties.DesignStyle>
        <Style TargetType="UserControl">
            <Setter Property="Background" Value="White" />
            <Setter Property="Height" Value="500" />
            <Setter Property="Width" Value="500" />
        </Style>
    </d:DesignerProperties.DesignStyle>
</UserControl>

Background属性就是您所要求的。HeightWidth确实替换了<UserControl>标记中的d:DesignHeight=500d:DesignWidth=500。这样,您就可以在一个地方拥有所有的设计属性。
但是请注意,在Style属性上设置的任何值(在运行时使用的值)也将覆盖设计器中的DesignStyle

insrf1ej

insrf1ej2#

我发现你可以自己做一个。Custom design-time attributes in Silverlight and WPF designer是一个如何为Silverlight和WPF做的教程。

roejwanj

roejwanj3#

我的答案在这里找到:Black Background for XAML Editor。有许多选择,包括在运行时检查System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)

c3frrgcw

c3frrgcw4#

这是DesignBackground的完整解决方案:

public class DesignTimeProperties : DependencyObject
    {
        private static readonly Type OwnerType = typeof(DesignTimeProperties);

        #region DesignBackground (attached property)

        public static Brush GetDesignBackground(DependencyObject obj)
        {
            return (Brush)obj.GetValue(DesignBackgroundProperty);
        }

        public static void SetDesignBackground(DependencyObject obj, Brush value)
        {
            obj.SetValue(DesignBackgroundProperty, value);
        }

        public static readonly DependencyProperty DesignBackgroundProperty =
            DependencyProperty.RegisterAttached(
                "DesignBackground",
                typeof (Brush),
                OwnerType,
                new FrameworkPropertyMetadata(Brushes.Transparent,
                    DesignBackgroundChangedCallback));

        public static void DesignBackgroundChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (IsInDesignMode)
            {
                var control = d as Control;
                var brush = e.NewValue as Brush;
                if (control != null && brush != null)
                {
                    control.Background = brush;
                }
            }
        }

        public static bool IsInDesignMode
        {
            get
            {
                return
                    ((bool)
                        DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof (DependencyObject)).DefaultValue);
            }
        }

        #endregion

    }

用法:

<UserControl ... infra:DesignTimeProperties.DesignBackground="Black" />
dly7yett

dly7yett5#

本页所示的d:DesignerProperties.DesignStyle技术非常适合将WPF仅设计时样式应用于单个控件,但它似乎不适用于ResourceDictionary中的Style,而ResourceDictionary将应用于字典范围内的“所有”类型适当的控件或元素。仅样式为ResourceDictionary
例如,考虑包含TreeViewWindow,其中我们希望TreeViewItem节点显示为完全展开-但仅在设计时。首先,以常规方式将所需样式放入XAML字典中。

<Window.Resources>
    <Style TargetType="TreeViewItem">
        <Setter Property="IsExpanded" Value="True" />
    </Style>
</Window.Resources>

在这里,Style被放入WindowResourceDictionary中,但是当然你也可以使用任何其他包含字典。接下来,在C#代码中,* 当设计模式notdetected* 时,从Resource­Dict­ionary中删除样式。在OnInitialized重写中执行此操作:

protected override void OnInitialized(EventArgs e)
{
    if (DesignerProperties.GetIsInDesignMode(this) == false)
        Resources.Remove(typeof(TreeViewItem));

    base.OnInitialized(e);
}

设计模式: 运行时模式:

相关问题