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.