2010-03-21 81 views
8

我正在使用Visual Studio 2010 RC1。無法訪問app.xaml中定義的資源

我app.xaml_定義資源「Brush2」:

<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> 

在我的主窗口,我嘗試使用資源:

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

不管我做什麼,它總是引發運行時異常(未找到資源)。我改變了 構建行動沒有成功。

如何使用app.xaml中定義的資源?

回答

4

你所做的一切都不正確。你可能有1)以某種方式搞砸了項目構建,而是隨機做了一些事情來試圖讓它工作,或者2)其他事情正在發生,我們永遠不會知道沒有例外的細節。

我強烈建議您嘗試在新的全新WPF項目中重新制作此代碼。執行以下步驟(並且僅執行以下步驟):

創建一個新的WPF項目,將相同的畫筆添加到app.xaml,然後打開Window1並將窗口背景綁定到資源。運行應用程序。

它應該按預期工作。如果不是,則返回異常詳細信息。如果確實如此,請將這個新項目與您當前的項目進行比較,以查看您所做的改變。

+1

感謝您的建議,它終於有效。我明確地將項目屬性中的啓動對象設置爲我自己定義的某個類。我將其改爲「(未設置)」,它起作用。多麼奇怪...... – DerKlaus 2010-03-21 15:33:56

+0

這實際上是有道理的。未設置將導致App.xaml被解釋爲找出在啓動時要做什麼。將它設置爲你自己的類將導致這種情況不會發生,除非你明確做到了。 – 2010-03-21 15:39:46

+1

@DerKlaus - 感謝您的評論!我將App.xaml的構建操作設置爲Page,這樣我就可以創建自己的入口點。 (這當然會導致我在設計時從加載樣式中丟失我的共享資源字典)。我不知道在讀取評論之前,我可以在項目屬性中設置啓動對象。這使我可以將App.xaml的構建操作設置迴應用程序定義!再次感謝! – Scott 2010-05-27 20:21:07

16

如果您已設置啓動對象爲自定義類,你需要創建自定義的應用程序類,並調用它的InitializeComponent方法,像這樣:

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

更新:由於@ qqww2建議InitializeComponent通話可以在App類構造函數中移動。

+1

或者,更好的方法是將'InitializeComponent();'方法添加到App類的構造函數中。創建對象後不需要記住函數調用。 – 2016-01-20 15:05:42

+0

你是對的,這就是我在某個時候開始使用它的原因。但我忘了更新這個答案。感謝您指出這一點! – ceco 2016-01-20 16:43:06

+0

這正是我需要找到的。 – sidbushes 2016-11-21 15:57:14

3

我知道有一個已經被接受的答案,但我想我也會添加我的解決方案。我有代碼工作,但一些配置更改打破了設計器中的資源引用。在執行代碼時,它工作正常。

經過一些初步研究,我確定App.xaml的BuildAction屬性應該設置爲ApplicationDefinition。我被設置爲Page。但是,這會導致多個入口點出現問題。 Main()已經在App.xaml.cs中定義。編譯錯誤指示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中設置了一個字段來保存我的彈出窗口(Preferences和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) 
{ 
}