【问题标题】:Is it possible to include sections of XAML from a separate XAML file?是否可以从单独的 XAML 文件中包含 XAML 的部分?
【发布时间】:2025-11-27 02:55:01
【问题描述】:

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

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

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

【问题讨论】:

  • 对于布局部分,您可以创建UserControlDataTemplate并将其用作ContentTemplate,如果有资源可以创建ResourceDictionary
  • 如果我要绑定标签,哪一个最合适?
  • 说实话,我会做所有这些。创建UserControl 假设它在特定视图模型DataContext 中工作,具有所有绑定,然后创建DataTemplate 使用您的Usercontrol 作为内容,DataType 用于隐式使用或x:Key 用于显式使用并放置它在一些ResourceDictionary。它使您可以灵活地手动使用 UserControl 或显式使用 DataTemplate 甚至 WPF 根据 DataType 和当前内容隐式选择 DataTemplate
  • 主 XAML 文件 是什么意思?您是在谈论您的App.xaml 文件还是其他资源文件?如果是这样,请参阅 MSDN 上的 Merged Resource Dictionaries 页面。

标签: c# wpf xaml import include


【解决方案1】:

我在几年前工作的一个符合 MVVM 的项目中遇到了类似的问题。 我有一些 XAML“资源”存储在数据库中,我需要检索它们以便将它们插入到一些 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(例如像我这样的数据库)。

【讨论】:

    最近更新 更多