是否可以从单独的XAML文件中包含XAML的部分?

时间:2015-02-04 10:51:25

标签: c# wpf xaml import include

我开发了一个大型WPF应用程序,并希望将XAML文件的不同部分提取到自己的XAML文件中,并将它们包含在主XAML文件中?

PHP中,可以使用require_once("nameOfFile.php")完成此操作,在Java中可以使用JSTL的<c:import>标记完成。

是否可以将项目主.XAML文件切分为几个较小的XAML文件并包含它们?

1 个答案:

答案 0 :(得分:0)

我有一个与MVVM兼容的项目有类似的问题,我在几年前工作过。 我有一些XAML&#34;资源&#34;存储在数据库中我需要检索它们,以便将它们插入到一些WPF窗口或用户控件中。所以我使用附属物。

为简单起见,我认为您的资源位于App.xaml,即类似的内容:

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <DockPanel x:Key="dockPanel" Margin="2">
            <TextBlock Text="A description..." Margin="0, 0, 2, 0" DockPanel.Dock="Top" />
            <RichTextBox />
        </DockPanel>
    </Application.Resources>
</Application>

所以你可以创建一个InsertXamlBehavior类:

namespace WpfApplication1
{
    public class InsertXamlBehavior
    {
        public static readonly DependencyProperty KeyProperty =
            DependencyProperty.RegisterAttached("Key", typeof(string), typeof(InsertXamlBehavior), new UIPropertyMetadata(null, new PropertyChangedCallback(OnKeyChanged)));

        public static string GetKey(DependencyObject obj)
        {
            return (string)obj.GetValue(KeyProperty);
        }

        public static void SetKey(DependencyObject obj, string value)
        {
            obj.SetValue(KeyProperty, value);
        }

        private static void OnKeyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
        {
            IAddChild addChild = dependencyObject as IAddChild;
            if (addChild != null)
            {
                if (args.NewValue != null)
                {
                    addChild.AddChild(App.Current.FindResource(args.NewValue));
                }
            }
            else
            {
                throw new NotSupportedException();
            }
        }
    }
}

现在您可以轻松地在窗口中插入XAML资源:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="600">

    <StackPanel>
        <TextBlock Text="Here an inserted XAML resource..." Margin="2" />
        <Border Margin="2" Padding="4" BorderBrush="Gray" BorderThickness="2" local:InsertXamlBehavior.Key="dockPanel" />
    </StackPanel>
</Window>

当然,您可以更改InsertXamlBehavior,以便从您喜欢的来源检索您的XAML(例如我喜欢的数据库)。