正如 Jakob Christensen 所说,您可以使用 XamlReader.Load 加载您想要的任何 XAML。这不仅适用于样式,还适用于UIElements。您只需像这样加载 XAML:
UIElement rootElement;
FileStream s = new FileStream(fileName, FileMode.Open);
rootElement = (UIElement)XamlReader.Load(s);
s.Close();
然后您可以将其设置为合适元素的内容,例如对于
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Foo Bar">
<Grid x:Name="layoutGrid">
<!-- any static elements you might have -->
</Grid>
</Window>
您可以在grid 中添加rootElement:
layoutGrid.Children.Add(rootElement);
layoutGrid.SetColumn(rootElement, COLUMN);
layoutGrid.SetRow(rootElement, ROW);
您自然还必须在代码隐藏中手动连接rootElement 内元素的任何事件。例如,假设您的rootElement 包含一个Canvas 和一堆Paths,您可以像这样分配Paths' MouseLeftButtonDown 事件:
Canvas canvas = (Canvas)LogicalTreeHelper.FindLogicalNode(rootElement, "canvas1");
foreach (UIElement ui in LogicalTreeHelper.GetChildren(canvas)) {
System.Windows.Shapes.Path path = ui as System.Windows.Shapes.Path;
if (path != null) {
path.MouseLeftButtonDown += this.LeftButtonDown;
}
}
我没有尝试过动态切换 XAML 文件,所以我不能说这是否真的有效。