WPF XAMLには、便利なDesignHeight
とDesignWidth
があります。
<UserControl ... d:DesignHeight="500" d:DesignWidth="500" ... />
代表でレイアウトを作成できるので、これは素晴らしいことですが、ロックインされていない、コントロールサイズです。
ただし、ラベルなどを白にする必要がある暗いUIを作成することがよくありますが、コントロールには透明な背景色が必要です。これは、デザイナーの透明なコントロールのデフォルトの背景色が白であるように思われるため、デザイン時に不便を引き起こし、白地に白のラベルが読めなくなります。
DesignHeight/DesignWidthと同様の便利さで、デザイン時の背景色を設定する方法や戦略はありますか?
私の答えはここで見つかりました: XAMLエディターの黒い背景 。実行時にSystem.ComponentModel.DesignerProperties.GetIsInDesignMode(this)
をチェックするなど、いくつかの選択肢があります。
文書化されていないプロパティがありますd:DesignStyle
タイプStyle
で、ユーザーコントロールで設定できます。このスタイルはデザイナでのみ適用され、実行時には使用されません。
あなたはそれをこのように使います:
<UserControl ... d:DesignStyle="{StaticResource MyDesignStyle}" />
またはこのように:
<UserControl ...>
<d:DesignerProperties.DesignStyle>
<Style TargetType="UserControl">...</Style>
</d:DesignerProperties.DesignStyle>
</UserControl>
ただし、Style
プロパティ(実行時に使用される値)に設定された値は、デザイナのDesignStyle
もオーバーライドすることに注意してください。
自分でできることがわかりました。 SilverlightおよびWPFデザイナーのカスタムデザイン時属性 は、SilverlightとWPFの両方でそれを行う方法のチュートリアルです。
このページに示されている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>
ここで、Style
はResourceDictionary
のWindow
に配置されますが、もちろん、代わりに他の包含辞書を使用することもできます。次に、C#コードで、デザインモードがnot検出されたときにResourceDictionary
からスタイルを削除します。これはOnInitialized
オーバーライドにありますか?
protected override void OnInitialized(EventArgs e)
{
if (DesignerProperties.GetIsInDesignMode(this) == false)
Resources.Remove(typeof(TreeViewItem));
base.OnInitialized(e);
}
設計モード:実行時モード:
これは、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" />