WPF가 현재 설계 모드로 실행되고 있는지 여부를 확인할 수 있는 방법이 있습니까?
코드가 현재 설계 모드(예: Blend 또는 Visual Studio)에서 실행되고 있는지 확인할 수 있도록 사용할 수 있는 글로벌 상태 변수를 알고 있는 사람이 있습니까?
다음과 같이 됩니다.
//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode)
{
...
}
필요한 이유는 어플리케이션이 Expression Blend 디자인 모드로 표시되어 있을 때 ViewModel이 대신 디자인 모드에서 볼 수 있는 모의 데이터를 포함하는 "Design Customer 클래스"를 사용하고 싶기 때문입니다.
그러나 응용 프로그램이 실제로 실행될 때는 View Model이 실제 데이터를 반환하는 실제 고객 클래스를 사용하는 것이 좋습니다.
현재 이 문제를 해결하기 위해 디자이너가 작업하기 전에 View Model로 이동하여 Application Development Mode를 변경합니다.실행 중"을 "Application Development Mode"로 변경합니다.설계":
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);
}
}
}
Dependency Object를 사용하는 GetIsInDesignMode를 찾고 계신 것 같습니다.
이.
// 'this' is your UI element
DesignerProperties.GetIsInDesignMode(this);
편집: Silverlight / WP7 사용 시 다음부터 사용하세요.GetIsInDesignMode
Visual Studio에서 false를 반환할 수 있습니다.
DesignerProperties.IsInDesignTool
편집: 마지막으로 WinRT / Metro / Windows Store 어플리케이션의 완전성을 위해 다음과 같습니다.
Windows.ApplicationModel.DesignMode.DesignModeEnabled
다음과 같은 작업을 수행할 수 있습니다.
DesignerProperties.GetIsInDesignMode(new DependencyObject());
public static bool InDesignMode()
{
return !(Application.Current is App);
}
어디서든 작동 가능.디자이너에서 데이터 사운드가 재생되지 않도록 하기 위해 사용합니다.
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"
Visual Studio에서 자동으로 코드를 생성했을 때
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
...
}
캘리번을 광범위하게 사용하는 경우.대형 WPF/Silverlight/WP8/WinRT 어플리케이션용 마이크로로 쉽고 범용적인 캘리번 사용 가능Execute.InDesignMode
뷰 모델에서도 정적 속성을 사용할 수 있습니다(Visual Studio와 마찬가지로 Blend에서도 작동합니다).
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"
//};
}
}
수용된 답변은 나에게 효과가 없었습니다(VS2019).
무슨 일이 일어나고 있는지 살펴본 결과, 다음과 같은 생각이 들었습니다.
public static bool IsRunningInVisualStudioDesigner
{
get
{
// Are we looking at this dialog in the Visual Studio Designer or Blend?
string appname = System.Reflection.Assembly.GetEntryAssembly().FullName;
return appname.Contains("XDesProc");
}
}
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
코드 전체에서 글로벌하게 사용할 수 있는지 확인합니다.뷰 모델을 더미 데이터로 채웁니다.
너희 반에 빈 컨스트럭터가 필요 없다면 좋은 생각이 있어.
이 아이디어는 빈 컨스트럭터를 작성한 후 OldoiseAttribute로 마킹하는 것입니다.디자이너는 오래된 속성을 무시하지만 사용자가 사용하려고 하면 컴파일러가 오류를 발생시키기 때문에 실수로 사용자가 직접 사용할 위험이 없습니다.
Public Class SomeClass
<Obsolete("Constructor intended for design mode only", True)>
Public Sub New()
DesignMode = True
If DesignMode Then
Name = "Paula is Brillant"
End If
End Sub
Public Property DesignMode As Boolean
Public Property Name As String = "FileNotFound"
End Class
그리고 xaml:
<UserControl x:Class="TestDesignMode"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:vm="clr-namespace:AssemblyWithViewModels;assembly=AssemblyWithViewModels"
mc:Ignorable="d"
>
<UserControl.Resources>
<vm:SomeClass x:Key="myDataContext" />
</UserControl.Resources>
<StackPanel>
<TextBlock d:DataContext="{StaticResource myDataContext}" Text="{Binding DesignMode}" Margin="20"/>
<TextBlock d:DataContext="{StaticResource myDataContext}" Text="{Binding Name}" Margin="20"/>
</StackPanel>
</UserControl>
다른 작업에 빈 생성자가 정말로 필요한 경우 이 방법은 작동하지 않습니다.
언급URL : https://stackoverflow.com/questions/834283/is-there-a-way-to-check-if-wpf-is-currently-executing-in-design-mode-or-not
'source' 카테고리의 다른 글
Git은 BLOB에서의 SHA-1 충돌에 어떻게 대처합니까? (0) | 2023.04.11 |
---|---|
NAMED 콘텐츠를 사용하여 WPF UserControl을 작성하는 방법 (0) | 2023.04.11 |
Git 저장소의 병합 충돌을 해결하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
제목 변경 시 원치 않는 UIButton 애니메이션을 중지하는 방법 (0) | 2023.04.11 |
SQL Server "텍스트" 데이터 유형의 WHERE 절 (0) | 2023.04.11 |