디자인 타임에 WPF 애플리케이션에서 애플리케이션 디렉터리를 어떻게 가져오나요?

StackOverflow https://stackoverflow.com/questions/1808856

문제

내 WPF 애플리케이션에서 애플리케이션 디렉터리를 어떻게 얻나요? 디자인 타임에? 내 XAML이 디자이너에 표시되는 동안 디자인 타임에 내 응용 프로그램의 현재 디렉터리에 있는 리소스에 액세스해야 합니다.다음에 지정된 솔루션을 사용할 수 없습니다. 이 질문 디자인 타임과 마찬가지로 둘 다 System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) 그리고 System.Reflection.Assembly.GetExecutingAssembly().Location IDE의 위치를 ​​지정합니다(Visual Studio...Common7 또는 뭔가).

내 목표를 더 명확히 해달라고 요청하면:디자인 타임에 데이터베이스 테이블에 액세스하여 해당 데이터의 그래픽을 표시하고 싶습니다.디자인은 Visual Studio 2008에서 수행되었으므로 나에게 필요한 것은 매우 구체적인 문제에 대한 매우 구체적인 솔루션이며, 이를 위해서는 내 앱의 어셈블리 디렉터리를 가져오는 것이 필요합니다.

도움이 되었습니까?

해결책

설명에서 코드가 실제로 Visual Studio 내 WPF 디자이너 내에서 실행되는 것처럼 들립니다. 예를 들어 디자인에 사용되는 사용자 정의 제어 라이브러리의 일부입니다.

이 경우 Assembly.GetEntryAssembly() NULL을 반환하지만 다음 코드는 응용 프로그램 디렉토리의 경로를 가져옵니다.

  string applicationDirectory = (
    from assembly in AppDomain.CurrentDomain.GetAssemblies()
    where assembly.CodeBase.EndsWith(".exe")
    select System.IO.Path.GetDirectoryName(assembly.CodeBase.Replace("file:///", ""))
    ).FirstOrDefault();

다음 단계는이 작품을 Vs.net 2008의 WPF 디자이너 도구 내부에서 보여주는 데 사용될 수 있습니다.

  1. 이 코드를 "WPF 사용자 정의 제어 라이브러리"또는 "클래스 라이브러리"프로젝트 내에 배치하십시오.
  2. 데이터베이스를 읽고 디스플레이에 대한 데이터를 반환하는 데 필요한 코드를 추가합니다 (제 경우에는 응용 프로그램 디렉토리 자체를 문자열로 반환했습니다).
  3. 디자인중인 프로젝트에서 라이브러리 프로젝트 참조
  4. XAML 파일의 사용자 정의 컨트롤 또는 클래스를 사용하여 DataContext를 채우거나 UI에 데이터를 공급합니다 (내 경우 x : static을 사용하여 데이터 콘텍스트를 바인딩).
  5. "Wind

이 단계를 따르면,보고있는 객체는 실행 시간과 설계 시간에 동일한 방식으로 데이터베이스의 데이터로 채워집니다.

이 동일한 기술도 작동하는 다른 시나리오가 있으며 귀하의 요구에 따라 사용할 수있는 다른 솔루션이 있습니다. 귀하의 요구가 위에서 가정 한 요구 사항이 다른지 알려주십시오. 예를 들어, vs.net 애드 인을 작성하는 경우 완전히 다른 볼 게임에 있습니다.

다른 팁

디자이너 (예 : Visual Studio Designer 또는 Blend)를 지원하려고합니까?

그렇다면이 문제에 접근하는 다양한 방법이 있습니다. 일반적으로 다양한 디자인 도구 (VS, 표현 블렌드 등)에서 호스팅 될 수 있기 때문에 실행 파일에서 상대 경로를 의존하고 싶지 않습니다.

어쩌면 우리가 더 나은 답을 제공 할 수 있도록 해결하려는 문제를 더 자세히 설명 할 수 있습니까?

나는 이것이 가능하다고 생각하지 않습니다. 귀하는 잠재적으로 아직 건설되지도 않은 어셈블리의 위치를 ​​요구하고 있습니다.디자인 타임 코드는 애플리케이션 내부에서 실행되지 않으며 IDE에 대해 몇 가지 가정을 해야 합니다.이것은 나에게 잘못되고 깨지기 쉬운 느낌입니다. 다음 질문을 고려하십시오.

  • 프로젝트가 아직 구축되지 않았나요?
  • 그렇지 않은 경우 경로를 가져올 실행 파일이 없습니다. 그러면 어떻게 됩니까?
  • 빌드되지 않은 경우 다른 파일이 존재합니까, 아니면 빌드 아티팩트입니까?
  • 지어졌다면, 어디에 지어졌나요?
  • 다른 IDE를 고려해야 합니까?

이런 상황에서는 디자인 타임에 사용자가 편집할 수 있도록 개체에 속성을 추가하여 경로를 제공하거나 찾아보라고 요청해야 합니다.그런 다음 디자인 타임 코드는 속성 값을 사용하여 필요한 것을 찾을 수 있습니다.

Adorner 등을 사용하여 WPF 디자이너를 광범위하게 작업하는 경우 "컨텍스트"속성/유형을 사용하십시오.

세부:-설계 시간에는 modelitem의 인스턴스가 있습니다 (나는 그것을 알고 있습니다.

// DesignAdorner 클래스에서

public class DesignAdorner : PrimarySelectionAdornerProvider
{
      protected override void Activate(ModelItem item)
        {
                modelItem = item;
        }
}

이제 다음 단일 라인 코드를 사용하여 현재 응용 프로그램 경로에 액세스 할 수 있습니다.

string aplicationPathDir = System.IO.Directory.GetParent(modelItem.Context.ToString()).FullName;

도움이되지 않으면 알려주세요.

OK 여기서 더 설명이 여기에 내가 할 일이 있습니다.

Graemef가 제기 한 우려와 일치하는 것은 당신이 원하는 것을 취하는 것이 부서지기 쉬우 며 최상의 부서지기 쉽습니다.

이 때문에 일반적인 관행은 설계 시간 데이터 지원을 완전히 다른 접근 방식으로 런타임 데이터 지원으로 취급하는 것입니다. 간단히 말해서, 디자인 시간 환경 과이 DB 사이에 생성하는 커플 링은 나쁜 생각입니다.

시각화를위한 설계 시간 데이터를 간단히 제공하려면 런타임 클래스로 공통 인터페이스를 준수하는 모의 클래스를 사용하는 것이 좋습니다. 이것은 나에게 올바른 유형이며 내 런타임 개체와 동일한 계약을 준수 할 수있는 데이터를 보여줄 수있는 방법을 제공합니다. 그러나 이것은 설계 시간 지원에 사용되는 전적으로 다른 클래스입니다 (종종 단위 테스트에 사용됨).

예를 들어. 이름, 성 및 이메일과 같은 사람 세부 정보를 보여 주어야하는 런 타임 클래스가있는 경우 :

public class Person()
{
    public String FirstName { get; set;}
    public String LastName {get; set;}
    public Email EmailAddress {get; set;}
}

그리고 런타임에 DB 에서이 객체를 채우고 있었지만 설계 시간 시각화를 제공해야합니다. 계약을 준수하는 Iperson 인터페이스를 소개 할 수 있습니다.

public interface IPerson()
{
    String FirstName { get; }
    String LastName { get; }
    Email EmailAddress { get; }
}

그런 다음 런타임 사람 클래스를 업데이트하여 인터페이스를 구현했습니다.

public class Person() : IPerson
{
public String FirstName { get; set;}
public String LastName {get; set;}
public Email EmailAddress {get; set;}
}

그런 다음 동일한 인터페이스를 구현하고 설계 시간 사용을위한 현명한 값을 제공하는 모의 클래스를 만듭니다.

public MockPerson() : IPerson
{
public String FirstName { get { return "John"; } }
public String LastName { get { return "Smith"; } } 
public Email EmailAddress { get { return new Email("John@smith.com"); } }
}

그런 다음 디자인 시간에 Mockperson 객체와 런타임에 실제 사람 객체를 제공하는 메커니즘을 구현했습니다. 같은 것 이것 또는 이것. 이는 런타임과 설계 시간 환경 사이의 단단한 의존성없이 설계 시간 데이터 지원을 제공합니다.

이 패턴은 훨씬 유연하며 애플리케이션 전체에서 일관된 설계 시간 데이터 지원을 제공 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top