将单独文件中的普通XAML元素添加到资源字典中

时间:2017-04-13 05:58:22

标签: c# wpf xaml resourcedictionary

我有一个包含以下内容的xaml文件

Icon.xaml

(Import Component>Import Type Library)

正如您所看到的,文件中没有资源字典或自定义类。

现在我想将Icon.xaml包含在资源字典中,然后在我的代码中的任何地方使用它:

<Rectangle xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           x:Name="Icon"
           Width="16" Height="16">
<!-- Fancy DrawingBrush here to make a sweet icon -->
</Rectangle>

但是,我不明白如何告诉资源字典只包含普通XAML文件的内容。

请注意,我不是在运行时尝试加载XAML文件,而是将Icon.xaml编译到应用程序中。

2 个答案:

答案 0 :(得分:0)

您是否曾尝试将其app.xaml作为MergedDictionaries

<Application x:Class="WPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
             <ResourceDictionary Source="FolderWhereIsYourIconXaml/Icon.xaml" />
          </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

这样你可以像{StaticResource Icon}

一样调用它

但你必须把它变成一个ResouceDictionary。

答案 1 :(得分:0)

这需要一些调整,但这是我最终确定的代码:

我从DrawingBrush中删除了边界矩形,因为这是我真正想要的唯一东西:

<强> Icon.xaml

<DrawingBrush xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <DrawingBrush.Drawing>
        <DrawingGroup>
            <DrawingGroup.Children>
                <GeometryDrawing Brush="#00FFFFFF" Geometry="F1M16,16L0,16 0,0 16,0z" />
                <GeometryDrawing Brush="{StaticResource IconForegroundBrush}" Geometry="F1M8.999,1C7.814,1,6.666,1.422,5.768,2.188L3.992,3.692 3.992,1 1.994,3 1.994,5 1.994,6 1.994,7 5.99,7 7.988,5 5.54,5 7.061,3.713C7.6,3.253 8.289,3 8.999,3 10.651,3 11.996,4.346 11.996,6 11.996,6.877 11.613,7.708 10.936,8.29L5.34,13.252 6.664,14.748 12.248,9.797C13.358,8.846 13.994,7.461 13.994,6 13.994,3.243 11.753,1 8.999,1" />
            </DrawingGroup.Children>
        </DrawingGroup>
    </DrawingBrush.Drawing>
</DrawingBrush>   

我还将Icon.xaml的构建操作设置为Resource而不是Page

我已经创建了一个帮助程序类IconLocator来为我加载图标:

public static DrawingBrush Icon => Load("Icon.xaml");

private static DrawingBrush Load(string fileName)
{
    var uri = new Uri(Prefix + fileName);
    var info = Application.GetResourceStream(uri);            
    var brush = XamlReader.Load(info.Stream) as DrawingBrush;

    return brush;
}

我现在可以在任何地方使用这个DrawingBrush:

<Border Background="{x:Static res:IconLocator.Icon}"/>