web-dev-qa-db-ja.com

WPFのデザイン時のみの背景色?

WPF XAMLには、便利なDesignHeightDesignWidthがあります。

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

代表でレイアウトを作成できるので、これは素晴らしいことですが、ロックインされていない、コントロールサイズです。

ただし、ラベルなどを白にする必要がある暗いUIを作成することがよくありますが、コントロールには透明な背景色が必要です。これは、デザイナーの透明なコントロールのデフォルトの背景色が白であるように思われるため、デザイン時に不便を引き起こし、白地に白のラベルが読めなくなります。

DesignHeight/DesignWidthと同様の便利さで、デザイン時の背景色を設定する方法や戦略はありますか?

38
DuckMaestro

私の答えはここで見つかりました: XAMLエディターの黒い背景 。実行時にSystem.ComponentModel.DesignerProperties.GetIsInDesignMode(this)をチェックするなど、いくつかの選択肢があります。

8
DuckMaestro

文書化されていないプロパティがありますd:DesignStyleタイプStyleで、ユーザーコントロールで設定できます。このスタイルはデザイナでのみ適用され、実行時には使用されません。

あなたはそれをこのように使います:

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

またはこのように:

<UserControl ...>
    <d:DesignerProperties.DesignStyle>
        <Style TargetType="UserControl">...</Style>
    </d:DesignerProperties.DesignStyle>
</UserControl>

ただし、Styleプロパティ(実行時に使用される値)に設定された値は、デザイナのDesignStyleもオーバーライドすることに注意してください。

38

自分でできることがわかりました。 SilverlightおよびWPFデザイナーのカスタムデザイン時属性 は、SilverlightとWPFの両方でそれを行う方法のチュートリアルです。

9
Oybek

このページに示されているd:DesignerProperties.DesignStyle手法は、[〜#〜] wpf [〜#〜]の設計時のみを適用するのに最適です。 単一のコントロールにスタイルを設定しますが、Style内のResourceDictionaryでは機能しないようです。ディクショナリのスコープ内で適切に入力されたコントロールまたは要素のallに適用されます。以下は、デザイナー専用スタイルをResourceDictionaryにデプロイするために見つけた簡単なソリューションです。

たとえば、Windowを含むTreeViewを考えてみましょう。ここでは、TreeViewItemノードを完全に展開されたものとして表示しますが、設計時のみです。まず、通常の方法でXAMLディクショナリに目的のスタイルを配置します。

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

ここで、StyleResourceDictionaryWindowに配置されますが、もちろん、代わりに他の包含辞書を使用することもできます。次に、C#コードで、デザインモードがnot検出されたときにResource­Dict­ionaryからスタイルを削除します。これはOnInitializedオーバーライドにありますか?

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

    base.OnInitialized(e);
}

設計モード:実行時モード:

design moderuntime mode

1
Glenn Slayden

これは、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" />
0
Tal Segal