Existe-t-il une propriété DesignMode dans WPF?


Réponses:


152

En effet, il y a :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Exemple:

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

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

J'ai appliqué votre solution dans mon application mais cela ne fonctionne pas. Je l'ai demandé ici stackoverflow.com/questions/3987439/… . Si vous le souhaitez, rejoignez-nous et discutez-en.
— Nam G VU

@serhio Merci d'avoir signalé cela. Connaissez-vous une solution de contournement? Btw, il semble que cela ne fonctionne pas non plus dans Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837
— Enrico Campidoglio

Dans VS2019, le commutateur Enable project codedoit être activé (ou Menu-> Design-> 🗹 Run Project Code).
— marbel82

47

Dans certains cas, j'ai besoin de savoir si un appel à ma classe non-UI est lancé par le concepteur (comme si je crée une classe DataContext à partir de XAML). Ensuite, l'approche de cet article MSDN est utile:

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

J'ai appliqué votre solution dans mon application mais cela ne fonctionne pas. Je l'ai demandé ici stackoverflow.com/questions/3987439/… . Si vous le souhaitez, rejoignez-nous et discutez-en.
— Nam G VU

20

Pour tous les contrôles WPF hébergés dans WinForms , DesignerProperties.GetIsInDesignMode(this)ne fonctionne pas.

J'ai donc créé un bogue dans Microsoft Connect et ajouté une solution de contournement:

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

Ne devrait-il pas être à la GetEntryAssembly()place de GetExecutingAssembly()? Ce dernier devrait renvoyer l'assemblage où cette propriété est définie
— fjch1997

7

Réponse tardive, je sais - mais pour tous ceux qui souhaitent utiliser ceci dans un DataTrigger, ou n'importe où dans XAML en général:

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

Utilisez celui-ci:

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

(Les opérations Async et File ne fonctionneront pas ici)

En outre, pour instancier un objet au moment du design en XAML (d est l'espace de noms du concepteur spécial)

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

Cette classe ( Windows.ApplicationModel) est destinée aux applications Store, incluses dans l'API Windows Runtime. Ce n'est pas une solution WPF prête à l'emploi si vous travaillez uniquement sur une application de bureau Windows standard.
— qJake
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.