Esiste una proprietà DesignMode in WPF?


Risposte:


152

In effetti c'è :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Esempio:

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

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

Ho applicato la tua soluzione nella mia applicazione ma non funziona. L'ho chiesto qui stackoverflow.com/questions/3987439/… . Se vuoi, unisciti a noi e discuti.
Nam G VU

@serhio Grazie per averlo fatto notare. Sei a conoscenza di qualche soluzione alternativa? Btw sembra che non funzioni neanche in Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio

In VS2019 l'interruttore Enable project codedeve essere abilitato (o Menu-> Design-> 🗹 Esegui codice progetto).
marbel82

47

In alcuni casi ho bisogno di sapere se una chiamata alla mia classe non UI viene avviata dal designer (come se creo una classe DataContext da XAML). Quindi l'approccio di questo articolo di MSDN è utile:

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

Ho applicato la tua soluzione nella mia applicazione ma non funziona. L'ho chiesto qui stackoverflow.com/questions/3987439/… . Se vuoi, unisciti a noi e discuti.
Nam G VU

20

Per qualsiasi controllo WPF ospitato in WinForms , DesignerProperties.GetIsInDesignMode(this)non funziona.

Quindi, ho creato un bug in Microsoft Connect e ho aggiunto una soluzione alternativa:

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

Non dovrebbe essere GetEntryAssembly()invece di GetExecutingAssembly()? Quest'ultimo dovrebbe restituire l'assembly in cui questa proprietà è definita
fjch1997

7

Risposta tardiva, lo so, ma per chiunque voglia usarlo in un DataTrigger, o ovunque in XAML in generale:

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

Usa questo:

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

(Le operazioni Async e File non funzioneranno qui)

Inoltre, per creare un'istanza di un oggetto in fase di progettazione in XAML (d è lo spazio dei nomi di progettazione speciale)

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

Quella classe ( Windows.ApplicationModel) è per le app dello Store, incluse nell'API di Windows Runtime. Questa non è una soluzione WPF pronta per l'uso se stai solo lavorando su una normale applicazione desktop di Windows.
qJake
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.