2009-07-10 25 views
15

Tôi muốn có thể sử dụng đồ họa véc tơ, tốt nhất là được xác định trong XAML, là Nguồn của điều khiển Hình ảnh, giống như tôi hiện có thể sử dụng hình ảnh raster như PNG. Bằng cách đó tôi có thể dễ dàng trộn và kết hợp giữa bitmap và vector hình ảnh, như thế này:Sử dụng tệp XAML làm Nguồn ảnh vector

<StackPanel> 
    <Image Source="Images/Namespace.png"/> 
    <Image Source="Images/Module.xaml"/> 
</StackPanel> 

Module.xaml rất có thể sẽ có <DrawingImage> như phần tử gốc của nó thay vì <UserControl>.

Trên thực tế, những gì tôi đang thực sự xảy ra là này, vì vậy ViewModel của tôi có thể chọn hoặc là một raster hoặc hình ảnh vector theo quyết định của mình:

<Image Source="{Binding ImageUri}"/> 

Đây có phải là có thể? Có thể tải các lớp XAML của Image.Source từ một URI đã cho không? Hoặc là nó chỉ có thể tải các tài nguyên bitmap?

+4

Làm cho tôi băn khoăn ... Tại sao việc sử dụng hình ảnh XAML trong WPF/Silverlight rất khó, hoặc không được hỗ trợ nguyên bản ... xem xét WPF/Silverlight dựa trên XAML! – Jacques

Trả lời

1

1) Thêm DrawingImage.xaml vào dự án và đặt thuộc tính thành 'BuildAction = Content' và 'Copy Always'. Hoặc người nào khác bạn có thể tự động tải XAML từ bên ngoài kể từ khi logic tôi sẽ giải thích sẽ làm việc cho loose-xaml cũng.

2) Viết Converter để chuyển đổi các uri XAML để UIElement, trong trường hợp của bạn nó sẽ luôn luôn DrawingImage

public class FileToUIElementConverter :IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     FileStream fileStream = new FileStream((string)parameter, FileMode.Open); 
     return XamlReader.Load(fileStream) as DrawingImage; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

3) Viết XAML như sau

<Window.Resources> 
    <local:FileToUIElementConverter x:Key="uriToUIElementConverter"/> 
</Window.Resources> 
<Grid> 
    <Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=ImageDrawing.xaml}"/> 
</Grid> 
+0

Tôi không nghĩ rằng FileStream có thể tải từ một tài nguyên được biên dịch (pack: // URI), phải không? –

+0

Tôi đã thử cách nói trên và nó hoạt động tốt. –

+0

Có trình chuyển đổi xử lý tài nguyên tại đây: http://stackoverflow.com/a/21588195/418362 – Artfunkel

8

Bạn chỉ có thể tham khảo đồ họa vector của bạn dưới dạng StaticResources:

<Image Source="{StaticResource MyImage}" /> 

Lưu trữ hình ảnh trong ResourceDict ionary như DrawImage. Expression Blend có thể giúp bạn tạo ra công cụ này:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <DrawingImage x:Key="MyImage"> 
     <DrawingImage.Drawing> 
     <DrawingGroup> 
      <DrawingGroup.Children> 
       <GeometryDrawing Brush="Black" Geometry="M 333.393,... 100.327 Z "/> 
       <GeometryDrawing Brush="Black" Geometry="F1 M 202.309,... Z "/> 
         : 
      </DrawingGroup.Children> 
     </DrawingGroup> 
    </DrawingImage.Drawing> 
    </DrawingImage> 

</ResourceDictionary> 
+0

Chắc chắn. Không giúp tôi với kịch bản databinding, mặc dù (ít nhất là không trực tiếp). –

1

Nhúng tài nguyên XAML (DrawingImage) với loại 'Tài nguyên'. Sau đó, nó không phải là một tệp riêng biệt và có thể được tham chiếu trực tiếp qua một URI, như trong ví dụ ban đầu của bạn - NHƯNG URI là không tầm thường. Bạn phải tìm ra cú pháp URI "gói" của Microsoft và sử dụng cú pháp đó.

+0

Nó không phải là tài liệu, nhưng nội dung "gói" URI không được tải vào bộ nhớ cho đến khi _after_ bạn khởi tạo UIElement đầu tiên của bạn. Vì vậy, cố gắng sử dụng nó trong App.cs (trước khi MainWindow.xaml của bạn thậm chí đã được tải) là khá bực bội. Thay vào đó, hãy sử dụng nó trong trình xử lý MainWindow_Load của bạn. –

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