Is it possible to instantiate a Custom C# Control via script similar to how a standard unity control can be added? Ex: Button vs CustomControl
The custom C# Control
internal class LocalizationEntryElement : VisualElement
{
public string keyAttr { get; set; }
public string valueAttr { get; set; }
public new class UxmlFactory : UxmlFactory<LocalizationEntryElement, UxmlTraits>
{
}
public new class UxmlTraits : VisualElement.UxmlTraits
{
readonly UxmlStringAttributeDescription m_StringKey =
new UxmlStringAttributeDescription { name = "key-attr", defaultValue = "default_value" };
readonly UxmlStringAttributeDescription m_StringValue =
new UxmlStringAttributeDescription { name = "value-attr", defaultValue = "default_value" };
public override IEnumerable<UxmlChildElementDescription> uxmlChildElementsDescription
{
get { yield break; }
}
public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
{
base.Init(ve, bag, cc);
var ate = ve as LocalizationEntryElement;
ate.keyAttr = m_StringKey.GetValueFromBag(bag, cc);
ate.Add(new TextField("Id") { value = ate.keyAttr });
ate.valueAttr = m_StringValue.GetValueFromBag(bag, cc);
ate.Add(new TextField("Value") { value = ate.valueAttr });
}
}
}
The Editor Window
var uiAsset = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/LocalizationEditor.uxml");
var ui = uiAsset.CloneTree();
w.rootVisualElement.Add(ui);
//find the container
var row = w.rootVisualElement.Q<VisualElement>("EntryContainer");
//add the element to the container
row.Add(new Button());//this works
row.Add(new LocalizationEntryElement());//this does not work