source

WPF 엔트리 포인트 교환

itover 2023. 4. 12. 22:18
반응형

WPF 엔트리 포인트 교환

WPF는 자체 정의Main()방법.어떻게 교환하면 좋을까요?Main(통상은) WPF를 여는 방법MainWindow(예를 들어 명령줄 인수를 사용하여 비 WPF 스크립트모드를 추가하는 경우)

일부 예에서는 App.xaml의 빌드 액션을 다음과 같이 변경합니다.ApplicationDefinition로.Page직접 써보는 것도 있고Main()그 결과,Appclass를 호출합니다.Run()단, App.xaml의 어플리케이션 전체 리소스를 해결할 때 바람직하지 않은 결과가 발생할 수 있습니다.

대신, 나는 당신만의 것을 만들 것을 제안합니다.Main()Startup Object를 프로젝트 속성에서 해당 클래스는 다음과 같습니다.

public class EntryPoint {
    [STAThread]
    public static void Main(string[] args) {
        if (args != null && args.Length > 0) {
            // ...
        } else {
            var app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

이 일을 하는 것은 몇 가지 장점을 이용하기 위해서입니다.AppDomain다른 일이 발생하기 전에 가입해야 하는 이벤트(예:AssemblyResolve). App.xaml을 로 설정했을 때의 바람직하지 않은 결과Page제가 겪은 일 중에UserControlViews(M-V-VM)가 디자인 타임 중에 App.xaml에 저장된 리소스를 해결하지 못했습니다.

보통 편집은 제가 합니다.App.xaml이 지원을 추가하려면:

<Application x:Class="SomeNamespace.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Startup="Application_Startup">

제가 변경한 부분과 관련된 부분은StartupUri로.Startup이벤트 핸들러 포함App.xaml.cs다음은 예를 제시하겠습니다.

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        int verbose = 0;
        var optionSet = new OptionSet
        {
            { "v|verbose", "verbose output, repeat for more verbosity.",   
                    arg => verbose++ }
        };

        var extra = optionSet.Parse(e.Args);
        var mainWindow = new MainWindow(verbose);
        mainWindow.Show();
    }
}

문제는 프로그램에 2개의 정적 Main() 메서드가 있다는 것입니다.이것에 의해 컴파일러가 사이에 불만을 제기합니다.이 문제를 해결하려면 , 다음의 어느쪽인가를 시험해 주세요.

  • 컴파일러에게 스태틱 Main() 메서드가 실행 엔트리 포인트가 되어야 한다고 말합니다.프로젝트의 "시작 개체" 설정을 정적 Main() 메서드를 포함하는 클래스로 설정합니다(솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "속성"을 선택한 다음 "응용 프로그램" 탭에서 "시작 개체" 설정을 찾습니다).
  • App.g.cs의 정적 메인() 메서드의 자동 생성 끄기: Solution Explorer에서 App.xaml을 마우스 오른쪽 버튼으로 클릭하고 "Properties"를 선택한 다음 "Build Action"을 "ApplicationDefinition"에서 "Page"로 변경합니다.

커스텀 스태틱 Main 메서드를 사용하여 새 클래스를 만듭니다.이 메서드가 끝나면 원래 앱으로 전화하세요.WPF에 의해 생성된 Main():

public class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        // Your initialization code
        App.Main();
    }
}

그런 다음 프로젝트의 "시작 개체" 설정을 정적 기본()을 포함하는 클래스로 설정하십시오.

커스텀 Main()을 사용하면 StartupUri가 설정되어 있지 않기 때문에 문제가 발생할 수 있습니다.

이를 사용하여 앱 클래스에서 문제 없이 설정할 수 있습니다(App.xaml에서 StartupUri를 제거하고 빌드 액션을 페이지로 설정하는 것을 잊지 마십시오).

[STAThread]
static void Main()
{
    App app = new App();
    app.InitializeComponent();
    app.Run();
}

protected void OnStartup(object sender, StartupEventArgs e)
{
        var toUri = new UriTypeConverter();
        StartupUri = (Uri)toUri.ConvertFrom("MainWindow.xaml");
...
}

위의 답변 중 저에게 맞는 답변이 없어 게시합니다.제 경우 App.xaml에서 StartupUri가 삭제되어 오류가 아직 발생하고 있습니다.프로젝트 파일(Foo.csproj)에 다음 코드를 추가하여 문제를 해결했습니다.

<ItemGroup>
    <ApplicationDefinition Remove="App.xaml" />
    <Page Include="App.xaml" />
</ItemGroup>

언급URL : https://stackoverflow.com/questions/6156550/replacing-the-wpf-entry-point

반응형