Разобрать стили XAML в коде и загрузить пользовательский элемент управления - PullRequest
0 голосов
/ 09 мая 2018

У меня есть программа на С ++, которая анализирует коды C # с помощью Roslyn. Мне нужно преобразовать мои стили и пользовательские элементы управления просто в "выделенный код".

например у меня простой пользовательский элемент управления содержит кнопку.

Стиль 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

это возможно? спасибо

1 Ответ

0 голосов
/ 09 мая 2018

Ответ:

  1. Создание общедоступной версии пользовательского элемента управления:

    public CustomControl1() { }

  2. Создание общедоступной версии пользовательского элемента управления:

    public CustomControl1()
    {
        ResourceDictionary Parse_Resource = XamlReader.Parse(code_xaml) as ResourceDictionary;
        this.Resources = Parse_Resource;
    }
    

Решено: D

...