Как заметил Якоб Кристенсен, вы можете загрузить любой XAML по вашему желанию, используя XamlReader.Load
. Это относится не только к стилям, но и к UIElement
. Вы просто загружаете 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>
Вы можете добавить rootElement
в grid
с помощью:
layoutGrid.Children.Add(rootElement);
layoutGrid.SetColumn(rootElement, COLUMN);
layoutGrid.SetRow(rootElement, ROW);
Естественно, вам также придется подключать любые события для элементов внутри rootElement
вручную в коде. Например, если ваш rootElement
содержит Canvas
с кучей Path
s, вы можете назначить событие Path
s '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 на лету, поэтому я не могу сказать, сработает ли это на самом деле.