XAML 是 XML,因此您可以这样操作它,或者您可以将它作为字符串加载并使用字符串操作。
一旦编译成 baml 就有点麻烦了。
但是可以从“平面”未编译文件中加载资源字典。
如果 localappdata 并对其进行操作,则可以拥有未编译的资源字典。
有许多示例可以执行此处链接的此类操作:
https://social.technet.microsoft.com/wiki/contents/articles/28797.wpf-dynamic-xaml.aspx
或者您可以在 txt 文件中包含一段 xaml 并对其进行操作。
在我正在开发的套件中,我有一个这样的 txt 文件,其中包含:
<?xml version="1.0" encoding="utf-8" ?>
<DataGridTextColumn Binding="{Binding Factor[^^^Index^^^], Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="*"
xmlns:ui="clr-namespace:UILib;assembly=UILib"
xmlns:local="clr-namespace:ScenarioEditor"
xmlns:model="clr-namespace:ModelLib;assembly=ModelLib"
>
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<ui:IconParent Height="20" Width="30"
ui:IconParent.IPType="{x:Static model:UnitTypes.^^^EnumString^^^}"
ui:Icon.UnitType="{x:Static model:UnitTypes.^^^EnumString^^^}"
ui:Icon.Side="{Binding DataContext.DefenderSide
, RelativeSource={RelativeSource AncestorType=UserControl}}"
>
<ui:IconParent.ToolTip>
<ToolTip>
^^^EnumDescription^^^
</ToolTip>
</ui:IconParent.ToolTip>
<ui:UnitIcon Margin="2"/>
</ui:IconParent>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
然后我使用以下代码构建数据网格:
XElement col = GetXElement(@"pack://application:,,,/Views/AttackFactors/attackFactorColumn.txt");
foreach (UnitTypes ut in Enum.GetValues(typeof(UnitTypes)).Cast<UnitTypes>().Where(x=>x.ThisFights()==true).Select(x=>x).ToList())
{
XElement el = new XElement(col);
string colString = el.ToString()
.Replace("^^^Index^^^", ((int)ut).ToString())
.Replace("^^^EnumString^^^", ut.ToString())
.Replace("^^^EnumDescription^^^", ut.ToDescriptionString());
ParserContext context = new ParserContext();
context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
DataGridTextColumn tc = (DataGridTextColumn)XamlReader.Parse(colString, context);
dg.Columns.Add(tc);
};
您可以扩展该原则以构建在设计时合并的资源字典,以便您可以看到对设计时数据的影响。
仅设计时资源字典:
https://github.com/jbe2277/waf/wiki/WPF-Design-Time-Support-(Part-2)