2012-06-18 5 views
2

내 WPF 응용 프로그램에는 지정된 .ttf 파일을 사용하여 텍스트를 그리는 사용자 지정 Canvas 구현이 있습니다. ttf 파일은 나중에 특정 시점에 삭제 될 수있는 임시 위치에 있습니다. 내 문제는 일단 캔버스에 내 텍스트가 렌더링되면 ttf 파일은 열린 상태로 유지되는 것처럼 보이고 응용 프로그램이 종료 될 때까지 삭제할 수 없다는 것입니다. 글꼴 파일을 열어 두는 FormattedText 인스턴스가있는 것 같습니다. 누구든지 FormattedText를 "처분"하는 방법을 알고 있습니까? 아니면 다른 방법으로 렌더링 후 글꼴 파일이 닫혀 있는지 확인하십시오.FormattedText를 처리하는 방법/WPF에서 .TTF 파일을 놓으시겠습니까?

내 텍스트 드로잉 코드 :

public class MyCanvas : System.Windows.Controls.Canvas 
{ 
    protected override void OnRender(DrawingContext dc) 
    { 
     base.OnRender(dc); 

     // Some other drawing stuff... 

     FontFamily fontFamily = new FontFamily(fontUri); 
     Typeface typeFace = new Typeface(fontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); 
     FormattedText formattedText = new FormattedText(chars, System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, text.FontHeight, new SolidColorBrush(color)); 
     dc.DrawText(formattedText, new Point(text.X + offsetX, text.Y + offsetY)); 
     int textWidth = (int) formattedText.Width; 
     int textHeight = (int)formattedText.Height; 

     // Drawing continues... 
    } 
} 

참고 : 그것은 심지어 (그 라인을 주석 시도) 글꼴 파일을 잠글 DrawText를 호출 할 필요가 없습니다 것 같다. formattedText 인스턴스를 사용하여 textWidth 및 textHeight 변수를 할당하면 WPF에서 파일을 열어 둘 수 있습니다.

업데이트 : 내가 지금 현재 내가 기존에 실패 덮어 쓰는 경우 새 임시 글꼴 디렉토리를 생성하는 해결 방법을 사용하고,이 문제를 해결 할 수 없었습니다. 그것은 작동하지만, 나는 이렇게 행복하게하지 않아도됩니다. 그래서 나는 이것을 고치는 방법에 대한 어떤 제안에도 여전히 관심이 있습니다.

+0

당신이 codea 거의 재 작업과 "을 사용하여"블록에 넣어 봤어? 아직 글꼴을 다룰 필요가 없었으므로 지금은 테스트 프로젝트를 만들 시간이 없습니다. – MetalMikester

+0

그래, 내가 염두에두고 있지만 FormattedText, Typeface도 FontFamily IDisposable 구현 ... – ekholm

답변

1

아마 어떤 점에서 Presentation Font Cache와 관련이 있습니다. 프레젠테이션 글꼴 캐시는 글꼴 데이터 구조를 캐시하여 WPF 응용 프로그램이 더 잘 작동 할 수 있도록하는 서비스입니다. 아마도 파일을 잠근 상태로 유지하고있을 수도 있습니다.

프레젠테이션 글꼴 캐시 서비스가 중지되고 사용되지 않도록 변경하려고하십시오. 응용 프로그램을 실행 한 다음 글꼴 파일을 삭제할 수 있는지 확인하십시오.

프리젠 테이션 글꼴 사용 안 함 실제 원인 인 경우 캐시는 장기적인 해결책이 아닙니다. 프로그래밍 방식으로 중지했다가 다시 시작하면 ... 다른 WPF 응용 프로그램이 어떻게 영향을 미치는지 확신 할 수 없습니다.

도구를 사용하여 파일을 잠근 사용자를 확인하는 더 확실한 방법이 있습니다.

가능한 솔루션 당신이 관리하는 방법에 대한 WPF 걱정을하도록 할 수 있습니다, 응용 프로그램에서 리소스로 .TTF 파일을 넣어하는 것입니다 (파일 잠금 누구든지 해결하기 위해) 청소 해.

링크 :

UPDATE :

오브젝트가 처리 될 때 파일을 삭제하는 작업 또는 파일이 여전히 잠겨있어 처리 시간에 파일을 삭제할 수없는 래퍼 클래스를 작성할 수 있습니다. 그러면 가비지 콜렉터가 파일을 호출 할 때 파일이 삭제됩니다 완료 자.http://www.codeproject.com/Articles/84831/A-simple-technique-to-take-care-of-temporary-files

  • 또 다른 possiblity가이 FileOptions.DeleteOnClose을 사용하는 것입니다 - 당신은 당신이/열 생성 및 현재 열려있는 파일 핸들을 유지하는 글꼴 파일은 FontFamily를 사용하는 것이 가능했다 있는지 확인해야 할 것 에.

  • FileStream with DeleteOnClose File option

+0

제안 주셔서 감사하지만, 내 경우에는 문제가되지 않습니다. 실제로 필자의 시스템 (XP 및 .NET 4.0)에서는 Presentation Font Cache 서비스를 찾을 수 없습니다. Process Explorer에서 확인한 결과 글꼴 파일을 열어 두는 것이 내 응용 프로그램 프로세스입니다. 글꼴을 사용자가 동적으로 추가하고 제거해야하기 때문에 응용 프로그램에 ttf 파일을 포함시킬 수 없습니다. – ekholm

+0

@ekholm이 (가) –

+0

위의 업데이트를 만들었습니다. 제 경우의 글꼴 파일을 다른 파일과 함께 응용 프로그램에서 열고 저장할 수있는 구성 파일로 압축합니다. 설정을 열 때마다 임시 작업 폴더로 추출됩니다. 이 폴더는 새 구성이로드 될 때 정리해야합니다. 그래서 타이밍이 중요합니다. 즉, GC에 의존 할 수없고, 닫을 때 ttf 파일을 삭제하고 싶지 않습니다. 앱이 종료 될 때까지 닫히지 않기 때문입니다. 또한 TempFileCollection을 시도했지만 놀랍지 않게 잠긴 파일을 삭제할 수도 없습니다. – ekholm

관련 문제