我开发了一个大型WPF
应用程序,并希望将XAML文件的不同部分提取到自己的XAML文件中,并将它们包含在主XAML文件中?
在PHP
中,可以使用require_once("nameOfFile.php")
完成此操作,在Java
中可以使用JSTL的<c:import>
标记完成。
是否可以将项目主.XAML文件切分为几个较小的XAML文件并包含它们?
答案 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(例如我喜欢的数据库)。