มีคุณสมบัติ DesignMode ใน WPF หรือไม่


101

ใน Winforms คุณสามารถพูดได้

if ( DesignMode )
{
  // Do something that only happens on Design mode
}

มีอะไรแบบนี้ใน WPF ไหม


2
โปรดทราบว่า GetIsInDesignMode ได้รับผลกระทบจากข้อผิดพลาดมหาศาลเช่นเดียวกับคุณสมบัติ DesignMode
BlueRaja - Danny Pflughoeft

คำตอบ:


152

แท้จริงมี :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

ตัวอย่าง:

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

public class MyUserControl : UserControl
{
    public MyUserControl()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            // Design-mode specific functionality
        }
    }
}

ฉันใช้โซลูชันของคุณในแอปพลิเคชันของฉัน แต่ไม่ได้ผล ก็ถามได้ที่นี่stackoverflow.com/questions/3987439/… . หากคุณต้องการโปรดเข้าร่วมและพูดคุยกับเรา
Nam G VU

@serhio ขอบคุณที่ชี้ให้เห็น คุณทราบวิธีแก้ปัญหาใด ๆ หรือไม่? Btw ดูเหมือนว่าจะไม่ทำงานใน Silverlight เช่นกัน: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio

ในสวิตช์ VS2019 Enable project codeต้องเปิดใช้งาน (หรือ Menu-> Design-> 🗹 Run Project Code)
marbel82

47

ในบางกรณีฉันจำเป็นต้องทราบว่าการเรียกไปยังคลาสที่ไม่ใช่ UI ของฉันถูกเริ่มโดยผู้ออกแบบหรือไม่ (เช่นฉันสร้างคลาส DataContext จาก XAML) หรือไม่ แนวทางจากบทความ MSDN นี้มีประโยชน์:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}

ฉันใช้โซลูชันของคุณในแอปพลิเคชันของฉัน แต่ไม่ได้ผล ก็ถามได้ที่นี่stackoverflow.com/questions/3987439/… . หากคุณต้องการโปรดเข้าร่วมและพูดคุยกับเรา
Nam G VU

20

สำหรับการควบคุม WPF ใดเจ้าภาพใน WinForms , DesignerProperties.GetIsInDesignMode(this)ไม่ทำงาน

ดังนั้นฉันจึงสร้างจุดบกพร่องใน Microsoft Connectและเพิ่มวิธีแก้ปัญหา:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}

มันไม่ควรจะGetEntryAssembly()แทนGetExecutingAssembly()? หลังควรจะส่งคืนแอสเซมบลีที่คุณสมบัตินี้กำหนดไว้
fjch1997

7

คำตอบช้าฉันรู้ - แต่สำหรับใครก็ตามที่ต้องการใช้สิ่งนี้ใน a DataTriggerหรือที่ใดก็ได้ใน XAML โดยทั่วไป:

xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework"

<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
                 Path=(componentModel:DesignerProperties.IsInDesignMode)}" 
                 Value="True">
        <Setter Property="Visibility" Value="Visible"/>
    </DataTrigger>
</Style.Triggers>

0

ใช้อันนี้:

if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
    //design only code here
}

(การดำเนินการ Async และไฟล์จะไม่ทำงานที่นี่)

นอกจากนี้เพื่อสร้างอินสแตนซ์อ็อบเจ็กต์เวลาออกแบบใน XAML (d คือเนมสเปซผู้ออกแบบพิเศษ)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>

คลาสนั้น ( Windows.ApplicationModel) มีไว้สำหรับแอพ Store ซึ่งรวมอยู่ใน Windows Runtime API นี่ไม่ใช่โซลูชัน WPF แบบสำเร็จรูปหากคุณเพิ่งใช้งานแอปพลิเคชันเดสก์ท็อป Windows ทั่วไป
qJake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.