2010-03-21 37 views
8

Tôi đang sử dụng Visual Studio 2010 RC1.Không thể truy cập tài nguyên được xác định trong app.xaml

tôi xác định một tài nguyên "Brush2" trong app.xaml_:

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

Trong MainWindow của tôi, tôi đang cố gắng để sử dụng tài nguyên:

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

Không có vấn đề gì tôi làm điều đó luôn luôn đặt ra một ngoại lệ khi chạy (không tìm thấy tài nguyên). Tôi đã thay đổi xây dựng hành động mà không thành công.

Tôi làm cách nào để sử dụng tài nguyên được xác định trong app.xaml?

Trả lời

4

Không có gì bạn đã làm không chính xác. Bạn có 1) làm hỏng dự án xây dựng bằng cách nào đó trong khi ngẫu nhiên làm những việc để cố gắng làm cho nó hoạt động hoặc 2) cái gì khác đang diễn ra ở đây và chúng ta sẽ không bao giờ biết mà không có chi tiết ngoại lệ.

Tôi rất muốn đề xuất bạn thử repro điều này trong một dự án WPF hoàn toàn mới. Thực hiện các bước sau (và CHỈ các bước sau):

Tạo một dự án WPF mới, thêm chính xác cùng một brush vào app.xaml, sau đó mở Window1 và gắn nền của cửa sổ vào tài nguyên. Chạy ứng dụng.

Nó sẽ hoạt động như mong đợi. Nếu không, hãy quay lại với các chi tiết ngoại lệ. Nếu có, hãy so sánh dự án mới này với dự án hiện tại của bạn để xem bạn đang làm gì khác.

+1

Nhờ đề xuất của bạn, nó hoạt động cuối cùng. Tôi đặt rõ ràng đối tượng khởi động trong thuộc tính dự án cho một lớp nhất định mà tôi đã tự định nghĩa. Tôi đã thay đổi thành "(chưa đặt)" và nó hoạt động. Thật lạ lùng ... – DerKlaus

+0

Điều này thực sự có ý nghĩa. Not Set sẽ dẫn đến việc App.xaml được diễn giải để tìm ra những việc cần làm khi khởi động. Đặt nó vào lớp của riêng bạn sẽ dẫn đến điều đó không xảy ra trừ khi bạn đã làm điều đó một cách rõ ràng. –

+1

@DerKlaus - Cảm ơn bạn đã bình luận! Tôi đã thiết lập hành động xây dựng của App.xaml thành Trang để tôi có thể tạo điểm vào của riêng mình. (điều này tất nhiên đã khiến tôi mất từ ​​điển tài nguyên được chia sẻ của mình từ việc tải các kiểu vào lúc thiết kế). Tôi không biết tôi có thể đặt đối tượng khởi động trong thuộc tính dự án cho đến khi đọc nhận xét của bạn. Điều này cho phép tôi đặt hành động xây dựng của App.xaml trở lại Định nghĩa ứng dụng! Cảm ơn một lần nữa! – Scott

16

Nếu bạn đã thiết lập Startup Object để một lớp tùy chỉnh bạn cần để tạo ra các lớp ứng dụng tùy chỉnh và cũng gọi phương thức InitializeComponent của nó, như thế này:

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

Cập nhật: Như @ qqww2 đề nghị InitializeComponent cuộc gọi có thể được di chuyển bên trong hàm tạo lớp App.

+1

Hoặc, tốt hơn, hãy thêm phương thức 'InitializeComponent();' vào hàm tạo của lớp 'App'. Không cần nhớ cuộc gọi hàm sau khi tạo đối tượng. –

+0

Bạn nói đúng, đó là cách tôi đã bắt đầu sử dụng nó tại một số điểm. Nhưng tôi quên cập nhật câu trả lời này. Cám ơn bạn vì đã chỉ ra điều này! – ceco

+0

Đây chính xác là những gì tôi cần tìm. – sidbushes

3

Tôi biết có một câu trả lời đã được chấp nhận, nhưng tôi nghĩ tôi cũng sẽ thêm giải pháp của mình. Tôi đã có mã đã làm việc, nhưng một số thay đổi cấu hình đã phá vỡ tài nguyên tham khảo trong thiết kế. Trong thực thi mã, nó hoạt động tốt.

Sau một số nghiên cứu ban đầu, tôi xác định rằng thuộc tính BuildAction cho App.xaml phải được đặt thành ApplicationDefinition. My được đặt thành Trang. Tuy nhiên, điều đó gây ra một số vấn đề với nhiều điểm vào. Main() đã được định nghĩa trong App.xaml.cs. Lỗi biên dịch đã chỉ ra một điểm vào khác trong App.g.cs (đó là một tệp được tạo tự động).

Tôi đã kết thúc bằng cách sử dụng phương pháp # 3 được mô tả tại http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html. Ý tưởng cơ bản là bạn tạo một lớp mới chỉ chịu trách nhiệm khởi động. Trong trường hợp của tôi, tôi đặt tên nó là Startup.cs. Mã phải có mã tương tự như sau:

using System.Threading; 

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

Sau đó, trong cài đặt dự án, hãy thay đổi Ứng dụng -> Đối tượng khởi động để lớp mới của bạn được chọn.

3

Tôi đã gặp phải sự cố tương tự và đã giải quyết vấn đề, vì vậy tôi đã tìm tôi cũng có thể đăng giải pháp của mình. Tôi chỉ gặp lỗi Resource not found khi chạy như được mô tả ở trên. Trong Windows 8.1 C# App của tôi, tôi đã sử dụng một phong cách mà tôi đã định nghĩa, và nó cho thấy tốt trong Blend và khung nhìn thiết kế, nhưng không hoạt động khi chạy. Tôi đã cố gắng sử dụng phong cách này trong một SettingsFlyout tôi đã tạo sau these instructions.Sau khi nhận được rằng để làm việc, tôi thiết lập một lĩnh vực trong App.xaml để giữ lên flyouts của tôi (Preferences và ColorSettings) vì vậy tôi sẽ không được thực hiện một cái mới mỗi lần.

public static Preferences preferences; 
public static ColorSettings colorsettings; 

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

Sau khi poking xung quanh và googling trong khoảng một giờ, tôi đã tìm ra rằng tôi đã tạo flyouts quá sớm, và khi họ được tạo ra họ không thể truy cập tài nguyên của ứng dụng. Vì vậy, tôi đã chuyển đổi tác phẩm của họ xuống App.OnLaunched() và đã giải quyết được vấn đề.

Tôi không chắc đó có phải là cách tốt nhất để đi về mọi thứ, nhưng nó hoạt động. Vì vậy, hãy thử xác định nơi bạn đang cố truy cập các tài nguyên bạn muốn và nếu bạn có thể đang cố gắng quá sớm. Xin lỗi vì sự mơ hồ và có lẽ không chính xác, tôi thực sự mới với WPF.

3

Tôi có thể đồng ý rằng tài nguyên sẽ bị rối tung lên dễ dàng nếu bạn có thứ gì đó trong Trình tạo ứng dụng. Di chuyển khởi tạo các đối tượng toàn cầu của riêng bạn vào phương pháp OnStartup:

protected override void OnStartup(StartupEventArgs e) 
{ 
} 
Các vấn đề liên quan