私たちはときにWindow
、追加の属性タイププロパティの変更通知を作成し、我々は、オブジェクトがウィンドウに依存しているかどうかを判断する必要があります。しかし、直接それがあるかどうかを判断する場合Window
のタイプは、このプロパティを設定デザイナで例外を指示します。
だから我々は、このウィンドウは、それを設計されて知ることができる方法はありませんか?だから、例外をスローしないだろう、とデザイナーのための完全なサポートすることができます。
方法A:デザイン時のプロパティが決定され
ネイティブ追加属性を保有するWPFは、設計が従属オブジェクトから誘導されたか否かを判断することができます。そして、この属性がありますDesignerProperties.IsInDesignMode
。
WPFデザイナでは、このプロパティは値を指定して設計されたメタデータに書き換えられtrue
て、他のデフォルトを、それがデフォルト値ですfalse
。
したがって、この値を決定することにより、設計者に、この付加的な特性かどうか、この時点で知ることができます。
if (DesignerProperties.GetIsInDesignMode(d))
{
// 通常我们考虑在设计器中不做额外的任何事情是最偷懒不会出问题的代码了。
return;
}
- 1
- 2
- 3
- 4
- 5
私は、あなたがソースコードを見ることができ、これらのブログに判断するために、このメソッドを使用しました:
- RevealBrushで流暢設計システム、WPFアナログ実装を設計した照明効果を滑らかに、それはすることができます!
- どのように書き込みマークアップ拡張機能MarkupExtension WPFに、でもそれは中のControlTemplate / DataTemplateの中に効果を取ることができます
方法2:デザインウィンドウの分析
上記方法は、共通の設計者を決定する方法です。我々はより多くの設計支援ではなく、上記のように直接を取得したい場合は、return
ありませんデザイナーの結果には、このプロパティは、その後、我々は、より正確な決意が必要になります。
あなたは裁判官とみなさ道の名前を入力することができるようにしかし、タイプの設計者は、我々は直接に参照することはできません。判定方法の名前は、Visual Studioのバージョンに関係します入力し、これはコードが格好良いではありませんどのように実際にあります。
私は次のように要約されている方法を判断します。
public static class WalterlvDesignTime
{
/// <summary>
/// 判断一个依赖对象是否是设计时的 <see cref="Window"/>。
/// </summary>
/// <param name="window">要被判断设计时的 <see cref="Window"/> 对象。</param>
/// <returns>如果对象是设计时的 <see cref="Window"/>,则返回 true,否则返回 false。</returns>
private static bool IsDesignTimeWindow(DependencyObject window)
{
const string vs201920172015Window =
"Microsoft.VisualStudio.DesignTools.WpfDesigner.InstanceBuilders.WindowInstance";
const string vs2013Window = "Microsoft.Expression.WpfPlatform.InstanceBuilders.WindowInstance";
if (DesignerProperties.GetIsInDesignMode(window))
{
var typeName = window.GetType().FullName;
if (Equals(vs201920172015Window, typeName) || Equals(vs2013Window, typeName))
{
return true;
}
}
return false;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
だから、ちょうどあなたがウィンドウのインスタンスを取得するには、このメソッドを呼び出すために必要なものをウィンドウのデザインかどうかです。
if (WalterlvDesignTime.IsDesignTimeWindow(d))
{
// 检测到如果是设计时的窗口,就跳过一些句柄等等一些真的需要一个窗口的代码调用。
}
else if (d is Window)
{
// 检测到真的是窗口,做一些真实窗口初始化需要做的事情。
}
else
{
// 这不是一个窗口,需要抛出异常。
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
私のブログはで開始されhttps://blog.walterlv.com/、および特色CSDNから解放されますが、それはめったに一度放出されない更新されます。
あなたが表示された場合は任意のは、ブログ、してください共有の内容を理解していません。私が建てDOTNET職業技術学院が参加することを歓迎します。
この作品は、ある非営利- -同一条件許諾4.0の国際ライセンス契約クリエイティブ・コモンズのライセンスのために。転載、使用、再投稿へようこそ、しかし陸毅によって署名記事を保つようにしてください(リンク含む:https://walterlv.blog.csdn.net/は)、商業目的のために使用してはならない、記事に基づいて作業が同一のライセンスを変更するようにしてくださいリリース。ご質問があれば、してください私に連絡。