[C#] WPF가 현재 디자인 모드에서 실행 중인지 확인하는 방법이 있습니까?

코드가 현재 디자인 모드 (예 : Blend 또는 Visual Studio)에서 실행 중인지 확인할 수 있도록 사용 가능한 전역 상태 변수를 아는 사람이 있습니까?

다음과 같이 보일 것입니다 :

//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode) 
{
    ...
}

내가 필요한 이유는 : Expression Blend에서 응용 프로그램이 디자인 모드로 표시 될 때 디자이너가 디자인 모드에서 볼 수있는 모의 데이터가있는 “Design Customer 클래스”를 ViewModel이 대신 사용하기를 원합니다.

그러나 응용 프로그램이 실제로 실행될 때 ViewModel이 실제 데이터를 반환하는 실제 Customer 클래스를 사용하기를 원합니다.

현재 디자이너가 작업하기 전에 ViewModel로 이동하여 “ApplicationDevelopmentMode.Executing”을 “ApplicationDevelopmentMode.Designing”으로 변경하여이 문제를 해결합니다.

public CustomersViewModel()
{
    _currentApplicationDevelopmentMode = ApplicationDevelopmentMode.Designing;
}

public ObservableCollection<Customer> GetAll
{
    get
    {
        try
        {
            if (_currentApplicationDevelopmentMode == ApplicationDevelopmentMode.Developing)
            {
                return Customer.GetAll;
            }
            else
            {
                return CustomerDesign.GetAll;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
}



답변

DependencyObject를 사용하는 GetIsInDesignMode를 찾고 있다고 생각합니다 .

즉.

// 'this' is your UI element
DesignerProperties.GetIsInDesignMode(this);

편집 : Silverlight / WP7을 사용하는 경우 Visual Studio에서 때때로 false를 반환 할 수 IsInDesignTool있으므로 사용해야합니다 GetIsInDesignMode.

DesignerProperties.IsInDesignTool

편집 : 마지막으로, 완성도를 높이기 위해 WinRT / Metro / Windows Store 응용 프로그램의 해당 기능은 DesignModeEnabled다음과 같습니다.

Windows.ApplicationModel.DesignMode.DesignModeEnabled


답변

다음과 같이 할 수 있습니다 :

DesignerProperties.GetIsInDesignMode(new DependencyObject());


답변

public static bool InDesignMode()
{
    return !(Application.Current is App);
}

어디서나 작동합니다. 데이터 바인딩 된 비디오가 디자이너에서 재생되지 않도록하는 데 사용합니다.


답변

Visual Studio가 자동으로 나를 위해 일부 코드를 생성했을 때

if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) 
{
    ...
}


답변

이 관련 답변에서 언급했듯이 WPF에서 디자인 타임 데이터를 지정하는 다른 방법 이있을 수 있습니다.

기본적으로 ViewModel디자인 타임 인스턴스를 사용하여 디자인 타임 데이터를 지정할 수 있습니다 .

d:DataContext="{d:DesignInstance Type=v:MySampleData, IsDesignTimeCreatable=True}"

또는 XAML 파일에 샘플 데이터를 지정하여 :

d:DataContext="{d:DesignData Source=../DesignData/SamplePage.xaml}">

SamplePage.xaml파일 속성을 다음과 같이 설정해야 합니다.

BuildAction:               DesignData
Copy to Output Directory:  Do not copy
Custom Tool:               [DELETE ANYTHING HERE SO THE FIELD IS EMPTY]

나는 UserControl이것을 다음과 같이 내 태그에 넣는다.

<UserControl
    ...
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    ...
    d:DesignWidth="640" d:DesignHeight="480"
    d:DataContext="...">

런타임시 모든 “d :”디자인 타임 태그가 사라 지므로 런타임 데이터 컨텍스트 만 가져 오지만 설정하도록 선택합니다.

편집
다음 줄이 필요할 수도 있습니다 (확실하지는 않지만 관련이있는 것 같습니다).

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 


답변

그리고 대규모 WPF / Silverlight / WP8 / WinRT 응용 프로그램에 Caliburn.Micro 를 광범위하게 사용하는 경우 뷰 모델에서도 편리하고 보편적 인 캘리 브릭의 정적 속성을 사용할 수 있습니다 (Visual Studio에서와 마찬가지로 Blend에서도 잘 작동 함).Execute.InDesignMode

using Caliburn.Micro;

// ...

/// <summary>
/// Default view-model's ctor without parameters.
/// </summary>
public SomeViewModel()
{
    if(Execute.InDesignMode)
    {
        //Add fake data for design-time only here:

        //SomeStringItems = new List<string>
        //{
        //  "Item 1",
        //  "Item 2",
        //  "Item 3"
        //};
    }
}


답변

Visual Studio 2013 및 .NET 4.5에서만 이것을 테스트했지만 트릭을 수행합니다.

public static bool IsDesignerContext()
{
  var maybeExpressionUseLayoutRounding =
    Application.Current.Resources["ExpressionUseLayoutRounding"] as bool?;
  return maybeExpressionUseLayoutRounding ?? false;
}

Visual Studio의 일부 설정에서이 값을 false로 변경할 수 있지만,이 경우 해당 리소스 이름이 있는지 여부 만 확인하면됩니다. 그것은이었다 null내가 디자이너 외부에 내 코드를 실행했을 때.

이 방법의 장점은 특정 App클래스에 대한 명시 적 지식이 필요하지 않으며 코드 전체에서 전 세계적으로 사용할 수 있다는 것입니다. 특히 뷰 모델을 더미 데이터로 채 웁니다.