코드가 현재 디자인 모드 (예 : 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}"
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
클래스에 대한 명시 적 지식이 필요하지 않으며 코드 전체에서 전 세계적으로 사용할 수 있다는 것입니다. 특히 뷰 모델을 더미 데이터로 채 웁니다.