c# - 在代码后面解析 XAML 样式并加载自定义控件
问题描述
我有一个使用 Roslyn 解析 C# 代码的 c++ 程序。我需要将我的样式和自定义控件转换为“代码隐藏”。
例如我有一个简单的自定义控件包含一个按钮。
XAML 风格:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CUSTOM_LIBRARY_PARSE">
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Button Background="#FF487DF0" >
<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center" OpacityMask="#FFC3C3C3" Content="{Binding text_of_button_Value, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:CustomControl1}}}" />
</Button>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
控制代码隐藏:
using System;
using System.Windows;
using System.Windows.Controls;
namespace CUSTOM_LIBRARY_PARSE
{
public class CustomControl1 : Control
{
public static readonly DependencyProperty text_of_button
= DependencyProperty.Register(
"text_of_button_Value",
typeof(string),
typeof(CustomControl1),
new PropertyMetadata(Environment.UserName)
);
public string text_of_button_Value
{
get { return (string)GetValue(text_of_button); }
set { SetValue(text_of_button, value); }
}
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
}
}
现在,我需要知道如何将 xaml 代码作为字符串嵌入到代码中,例如:
string code_xaml = "<ResourceDictionary\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n xmlns:local=\"clr-namespace:CUSTOM_LIBRARY_PARSE\">\n <Style TargetType=\"{x:Type local:CustomControl1}\">\n <Setter Property=\"Template\">\n <Setter.Value>\n <ControlTemplate TargetType=\"{x:Type local:CustomControl1}\">\n <Border Background=\"{TemplateBinding Background}\"\n BorderBrush=\"{TemplateBinding BorderBrush}\"\n BorderThickness=\"{TemplateBinding BorderThickness}\">\n <Button Background=\"#FF487DF0\" >\n <Label VerticalContentAlignment=\"Center\" HorizontalContentAlignment=\"Center\" OpacityMask=\"#FFC3C3C3\" Content=\"{Binding text_of_button_Value, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:CustomControl1}}}\" />\n </Button>\n </Border>\n </ControlTemplate>\n </Setter.Value>\n </Setter>\n </Style>\n</ResourceDictionary>\n";
然后用XamlParser解析它并将其加载到customcontrol1
那可能吗 ?谢谢
解决方案
答案是 :
创建自定义控件的公共版本:
public CustomControl1() { }
创建自定义控件的公共版本:
public CustomControl1() { ResourceDictionary Parse_Resource = XamlReader.Parse(code_xaml) as ResourceDictionary; this.Resources = Parse_Resource; }
已解决:D
推荐阅读
- python - 在 Numpy 中处理多维数组
- r - 如何将每日值转换为 R 的每月值
- android - 如何在 oauth 成功时重定向到 Activity A 或在 oauth 失败时重定向到 Activity B
- javascript - x.addEventListener 不是函数吗?
- java - 在 HP-UX 机器上忽略 32767 以上的 DB2 queryDataSize
- c# - 在 C# 中强制转换基数组的派生成员
- c# - 使用 MemoryStream 在远程位置 c# 上写入 .docx 文件
- angular - Microsoft Edge 浏览器上 PWA 中的 API 调用不起作用
- javascript - React - 检查数组中是否已经存在一个值?
- python - PostgreSQL 函数或 Python 脚本,每小时后将表数据导出到 csv