2010-03-21 4 views
8

Visual Studio 2010 RC1을 사용하고 있습니다.app.xaml에 정의 된 리소스에 액세스 할 수 없습니다.

나는 app.xaml_의 리소스 "Brush2"를 정의 : 아무리 그것이 항상을 제기하는 일

... 
<Border Margin="4,2" BorderBrush="Black" BorderThickness="2" CornerRadius="4" 
     ToolTip="{Binding Path=FullPath}" HorizontalAlignment="Stretch" 
     Background="{StaticResource Brush2}"> 
... 

: 내 MainWindow를에서

<Application x:Class="VideoThumbnails.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 

     <RadialGradientBrush x:Key="Brush2" RadiusX="1" RadiusY="1" GradientOrigin="0.3,0.3"> 
      <GradientStop Color="White" Offset="0"/> 
      <GradientStop Color="#ffc0c0" Offset="1"/> 
     </RadialGradientBrush> 

    </Application.Resources> 
</Application> 

는 그 자원을 사용하지하려고 런타임시 예외 (자원을 찾을 수 없음). 나는 성공하지 않고 동작을 변경했습니다.

어떻게 app.xaml에 정의 된 리소스를 사용할 수 있습니까?

답변

4

수행 한 작업이 잘못되었습니다. 당신은 1) 무작위로 일을하기 위해 일을하는 동안 어떻게 든 지어 지거나 2) 다른 일이 여기에서 진행되고 아무런 예외 사항 없이는 알지 못할 것입니다.

나는 아주 새로운 WPF 프로젝트에서 이것을 재현하려고 제안합니다. 다음 단계를 수행하고 다음 단계 만 수행하십시오.

새 WPF 프로젝트를 만들고 app.xaml에 똑같은 브러쉬를 추가 한 다음 Window1을 열고 창 배경을 리소스에 바인딩합니다. 앱을 실행합니다.

예상대로 작동해야합니다. 그렇지 않은 경우 예외 세부 사항으로 돌아가십시오. 그렇다면이 새 프로젝트를 현재 프로젝트와 비교하여 자신이하는 일을 다르게 파악하십시오.

+1

제안 덕분에 결국 작동합니다. 명시 적으로 프로젝트 속성의 시작 개체를 내가 정의한 특정 클래스로 설정했습니다. 나는 그것을 "(설정되지 않았다)"로 바꿨다. 이상한 ... – DerKlaus

+0

이것은 실제로 의미가 있습니다. Not Set을 선택하면 App.xaml이 시작시 수행 할 작업을 파악하도록 해석됩니다. 자신의 클래스로 설정하면 명시 적으로 않는 한 그렇게되지 않습니다. –

+1

@DerKlaus - 의견을 보내 주셔서 감사합니다! 내 자신의 진입 점을 만들 수 있도록 App.xaml의 Build 동작을 Page에 설정했습니다. (이 때문에 디자인 타임에 공유 스타일 사전을 공유 리소스 사전에서 잃게되었습니다.) 귀하의 의견을 읽을 때까지 프로젝트 속성에서 시작 개체를 설정할 수 있는지 몰랐습니다. 이 덕분에 App.xaml의 빌드 액션을 다시 Application Definition으로 설정할 수있었습니다! 다시 한 번 감사드립니다! – Scott

16

사용자 정의 클래스에 시작 개체를 설정 한 경우는 다음과 같이 그 InitializeComponent 메서드를 사용자 지정 응용 프로그램 클래스를 생성하고 또한 호출 할 필요가 :

App app = new App(); 
app.InitializeComponent(); 

업데이트 : @ qqww2가 InitializeComponent 전화를 제안한 것처럼 App 클래스 생성자 내에서 이동할 수 있습니다.

+1

아니면 더 나은 것은'App' 클래스의 생성자에'InitializeComponent();'메소드를 추가하는 것입니다. 객체를 만든 후에 함수 호출을 기억할 필요가 없습니다. –

+0

네 말이 맞아, 내가 그걸 어느 시점에서 사용하기 시작한거야. 그러나 나는이 대답을 잊어 버렸다. 이것을 지적 해 주셔서 감사합니다! – ceco

+0

정확히 내가 찾던 것이 필요합니다. – sidbushes

3

나는 이미 받아 들여진 대답이 있음을 알고 있지만, 나는 나의 해결책도 추가 할 것이라고 생각했다. 코드가 작동했지만 일부 구성 변경으로 인해 디자이너의 리소스 참조가 손상되었습니다. 코드를 실행하면 문제가 없습니다.

초기 연구 끝에 App.xaml의 BuildAction 속성을 ApplicationDefinition으로 설정해야한다고 결정했습니다. 내 페이지로 설정되었습니다. 그러나 이로 인해 여러 진입 점에서 문제가 발생합니다. Main()은 App.xaml.c에서 이미 정의되었습니다. 컴파일 오류가 App.g.cs (자동 생성 된 파일)의 다른 진입 점을 나타냅니다.

http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html에 설명 된 접근 # 3을 사용하여 끝났습니다. 기본 개념은 시작에 대한 책임 만있는 새 클래스를 만드는 것입니다. 필자의 경우 Startup.cs라는 이름을 사용했습니다. > 시작 개체 새 클래스가 선택되도록 - 응용 프로그램을 변경, 프로젝트 설정에서 다음

using System.Threading; 

namespace MyNamespace 
{ 
    public class Startup 
    { 
     [System.STAThreadAttribute()] 
     private static void Main() 
     { 
      var app = new App(); 
      app.InitializeComponent(); 
      app.Run(); 
     } 
    } 
} 

: 그것은이 유사한 코드가 있어야합니다.

3

나는 비슷한 문제가 있었고 해결되었으므로 해결책을 게시 할 수 있다고 생각했습니다. 위에서 설명한대로 런타임시에만 Resource not found 오류가 계속 발생했습니다. 내 Windows 8.1 C# App에서는 내가 정의한 스타일을 사용하고 있었으며 Blend와 디자이너보기에서는 정상적으로 나타 났지만 런타임에는 작동하지 않았습니다. these instructions 다음에 만든 SettingsFlyout에서이 스타일을 사용하려고했습니다.그 일을 마친 후 App.xaml에 필드를 설정하여 플라이 아웃 (환경 설정 및 ColorSettings)을 고정시켜 매번 새로운 필드를 만들지 않도록했습니다.

public static Preferences preferences; 
public static ColorSettings colorsettings; 

public App() 
{ 
    this.InitializeComponent(); 
    this.Suspending += OnSuspending; 
    preferences = new Preferences(); 
    colorsettings = new ColorSettings(); 
} 

주변에 파고 약 한 시간 동안 인터넷 검색 후, 나는 내가 너무 일찍 플라이 아웃을 만드는 것을 파악하고, 그들이 만든 때 응용 프로그램의 리소스에 액세스 할 수 있습니다. 그래서 나는 자신들의 창조물을 App.OnLaunched()으로 옮겼고 그게 문제를 해결했습니다.

이것이 최선의 방법 일지는 모르겠지만 효과가 있습니다. 따라서 원하는 리소스에 액세스하려고하는 위치와 너무 일찍 시도하는 경우를 찾아보십시오. 애매 모호하고 어쩌면 틀린 점에 대해 유감스럽게 생각합니다. 저는 WPF를 처음 접했습니다.

3

App 생성자에 무언가가 있다면 리소스가 쉽게 엉망이 될 것이라고 동의 할 수 있습니다. 자신의 전역 개체 초기화를 OnStartup 메서드로 이동하십시오.

protected override void OnStartup(StartupEventArgs e) 
{ 
} 
관련 문제