2014-04-09 12 views
7

Tôi có hai tệp .png được thêm vào tài nguyên của mình mà tôi cần truy cập vào Uri của chúng khi thực hiện liên kết.Cách lấy Uri của ảnh được lưu trong tài nguyên

đang xaml của tôi là như sau:

<Grid> 
    <Image> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="10" UriSource="{Binding Path=ImagePath}"/> 
    </Image.Source> 
    </Image> 
</Grid> 

binding mã sử dụng ImagePath là:

ImagePath = resultInBinary.StartsWith("1") ? Properties.Resources.LedGreen : Properties.Resources.ledRed; 

Tuy nhiên

Properties.Resources.LedGreen 

trả về một Bitmap thay vì String chứa Uri của hình ảnh cụ thể đó. Tôi chỉ muốn biết cách trích xuất giá trị đó mà không cần phải giải quyết đường dẫn của hình ảnh trong thư mục được lưu trữ. (Thành thật mà nói, tôi không chắc chắn là một điều phải làm như tôi không thể tìm thấy bất kỳ tình huống tương tự trên mạng).

Vui lòng cho tôi biết nếu có phương pháp ưu tiên cho phương pháp tôi đang cố gắng sử dụng nếu có.

Trả lời

18

Trong ứng dụng WPF, bạn thường sẽ không lưu trữ hình ảnh trong Properties/Resources.resx và truy cập chúng bằng phương tiện của lớp Properties.Resources. Thay vào đó, bạn chỉ cần thêm các tệp hình ảnh vào dự án Visual Studio của bạn dưới dạng tệp thông thường, có lẽ trong một thư mục có tên là "Hình ảnh" hoặc các loại tương tự. Sau đó, bạn sẽ đặt Build Action thành Resource, được thực hiện trong cửa sổ Thuộc tính. Bạn đến đó, ví dụ: bằng cách nhấp chuột phải vào tệp hình ảnh và chọn mục menu Properties. Lưu ý rằng giá trị mặc định của Build Action phải là Resource đối với các tệp hình ảnh dù sao.

Để truy cập các tài nguyên hình ảnh này từ mã, bạn sẽ sử dụng Pack URI. Với tên thư mục trên "hình ảnh" và một tập tin hình ảnh có tên là "LedGreen.png", tạo ra như một URI sẽ trông như thế này:

var uri = new Uri("pack://application:,,,/Images/LedGreen.png"); 

Vì vậy, bạn có lẽ có thể kê khai tài sản của bạn sẽ được loại Uri:

public Uri ImageUri { get; set; } // omitted INotifyPropertyChanged implementation 

và thiết lập nó như thế này:

ImageUri = resultInBinary.StartsWith("1") 
     ? new Uri("pack://application:,,,/Images/LedGreen.png") 
     : new Uri("pack://application:,,,/Images/LedRed.png"); 

Cuối cùng XAML của bạn sẽ giống như hình dưới đây, dựa vào tích hợp chuyển đổi loại hình từ Uri để ImageSource:

<Grid> 
    <Image Width="10" Source="{Binding Path=ImageUri}" /> 
</Grid> 
+0

Cảm ơn câu trả lời mô tả và quan trọng hơn là đề xuất về cách làm đúng.Tôi đã thực hiện giải pháp của tôi theo cách bạn đề xuất tuy nhiên tôi tự hỏi tôi có cần phải mang theo và giữ những hình ảnh này với tệp thực thi mà tôi sẽ giao cho nhóm khác không? Vì đây là một dự án khá đơn giản, tôi không có ý định tạo một trình cài đặt cho nó. – Mehrad

+1

Không, Hành động Xây dựng 'Tài nguyên' thêm các tệp hình ảnh vào assembly. Vì vậy, chúng được chứa trong thực thi. – Clemens

1

Khai báo thuộc tính Properties.Resources.LedGreenImageSource và đặt thành vị trí Uri thay vì đối tượng Bitmap.

Hoặc nếu bạn nhấn mạnh lưu trữ dưới dạng bitmap, bạn có thể lấy nguồn bằng cách trả lại Properties.Resources.LedGreen.ImageSource sẽ là loại ImageSource.

Tôi thích phương pháp tiếp cận đầu tiên hơn.

Các vấn đề liên quan