# UxmlElementAttribute

> Declares a custom control.

## Definition

* **Type:** Class
* **Namespace:** [UnityEngine.UIElements](/engine/6000.3/script-reference/unityengine/uielements.md)
* **Assembly:** UnityEngine.UIElementsModule
* **Inherits from:** [Attribute](https://learn.microsoft.com/dotnet/api/system.attribute)

```csharp
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class UxmlElementAttribute : Attribute
```

## Remarks

To create a custom control, you must add the UxmlElement attribute to the custom control class definition. You must declare the custom control class as a partial class and inherit it from [VisualElement](/engine/6000.3/script-reference/unityengine/uielements/visualelement.md) or one of its derived classes. When an element is marked with the UxmlElement attribute, a corresponding [UxmlSerializedData](/engine/6000.3/script-reference/unityengine/uielements/uxmlserializeddata.md) class is generated in the partial class. This data class contains a [SerializeField](/engine/6000.3/script-reference/unityengine/serializefield.md) for each field or property that was marked with the [UxmlAttributeAttribute](/engine/6000.3/script-reference/unityengine/uielements/uxmlattributeattribute.md) attribute. This serialized data allows for the element to be serialized from UXML and supports editing in the Attributes field of the Inspector window in  the UI Builder. The UxmlSerializedData includes a generated [UxmlSerializedData.CreateInstance()](/engine/6000.3/script-reference/unityengine/uielements/uxmlserializeddata/createinstance.md) method that uses the default constructor. You can use the [UxmlCreateInstanceMethodAttribute](/engine/6000.3/script-reference/unityengine/uielements/uxmlcreateinstancemethodattribute.md) to replace the default behaviour and provide your own creation method. By default, the custom control appears in the Library tab in UI Builder. The `visibility` field can be used to control the visibility of the custom control in the Library tab.

For an example of migrating a custom control from `UxmlFactory` and `UxmlTraits` to the `UxmlElement` and `UxmlAttributes` system, refer to [Enhanced custom controls creation with UXML](/engine/6000.3/manual/render-pipelines/universal-render-pipeline/introduction/installing-and-configuring-urp/upgrade-guides/upgrade-guide-unity-6.md#enhanced-custom-controls-creation-with-uxml).

The following example creates a custom control with multiple attributes:

```csharp
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

[UxmlElement]
public partial class ExampleVisualElement : VisualElement
{
 [UxmlAttribute]
 public string myStringValue { get; set; }

 [UxmlAttribute]
 public int myIntValue { get; set; }

 [UxmlAttribute]
 public float myFloatValue { get; set; }

 [UxmlAttribute]
 public List<int> myListOfInts { get; set; }

 [UxmlAttribute, UxmlTypeReference(typeof(VisualElement))]
 public Type myType { get; set; }

 [UxmlAttribute]
 public Texture2D myTexture { get; set; }

 [UxmlAttribute]
 public Color myColor { get; set; }
}
```

The following UXML document uses the custom control:

```csharp
<ui:UXML xmlns:ui="UnityEngine.UIElements">
 <ExampleElement my-string-value="Hello World" my-int-value="123" />
 <ExampleElement my-float-value="3.14" my-list-of-ints="1,2,3" />
 <ExampleElement my-string-value="Hello World" my-int-value="123" />
 <ExampleElement my-texture="project://database/Assets/MyTexture.png" />
 <ExampleElement my-color="#FF0000FF" />
 <ExampleElement my-type="UnityEngine.UIElements.Button, UnityEngine.UIElementsModule" />
</ui:UXML>
```

When you create a custom control, the default name used in UXML and UI Builder is the element type name (C# class name). However, you can customize the name to make it easier to refer to the element.

**Note**: You are still required to reference the classes' namespace in UXML. To create a custom name for an element, provide a value to the `name` property.

For example, if you create the following custom button:

```csharp
using UnityEngine.UIElements;

namespace MyNamespace
{
 [UxmlElement("MyButton")]
 public partial class CustomButtonElement : Button
 {
 }
}
```

You can then reference the custom button in UXML with the custom name or its type:

```csharp
<ui:UXML xmlns:ui="UnityEngine.UIElements">
 <MyNamespace.MyButton />
 <MyNamespace.CustomButtonElement />
</ui:UXML>
```

Certain namespaces in Unity, specifically those starting with Unity, UnityEngine, and UnityEditor, are reserved. As a result, the elements within these namespaces are hidden from the UI Builder library by default. However, you can override this behavior by explicitly configuring the visibility of these elements:

```csharp
using UnityEngine.UIElements;

namespace Unity.MyGame
{
 // This element is visible in the UI Builder library under "My Game/Inventory".
 [UxmlElement(libraryPath = "My Game/Inventory", visibility = LibraryVisibility.Visible)]
 public partial class VisibleItem : VisualElement
 {
 [UxmlAttribute]
 public string description { get; set; }
 }
}

// This element is hidden from the UI Builder library.
// However, you can still use it in UXML or C# code.
[UxmlElement(visibility = LibraryVisibility.Hidden)]
public partial class HiddenItem : VisualElement
{
 [UxmlAttribute]
 public string description { get; set; }
}
```

## Fields

| Value                                                                                                     | Description                                                                                                                                                                                   |
| --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [libraryPath](/engine/6000.3/script-reference/unityengine/uielements/uxmlelementattribute/librarypath.md) | Custom path to use when displaying the element in the UI Builder Library. Sub-paths can be created by using a forward slash (/). If no value is provided, the element namespace will be used. |
| [name](/engine/6000.3/script-reference/unityengine/uielements/uxmlelementattribute/name.md)               | Provides a custom name for an element.                                                                                                                                                        |
| [visibility](/engine/6000.3/script-reference/unityengine/uielements/uxmlelementattribute/visibility.md)   | Controls the visibility of the element in the UI Builder Library.                                                                                                                             |

## Constructors

| Constructor                                                                                                                                                                    | Description                                                                               |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| [UxmlElementAttribute()](/engine/6000.3/script-reference/unityengine/uielements/uxmlelementattribute/ctor.md#uxmlelementattribute\(\))                                         | Exposes a type of VisualElement to UXML and UI Builder                                    |
| [UxmlElementAttribute(System.String)](/engine/6000.3/script-reference/unityengine/uielements/uxmlelementattribute/ctor.md#uxmlelementattribute\(string\))                      | Declares a custom control with a custom element name.                                     |
| [UxmlElementAttribute(System.String,System.Type\[\])](/engine/6000.3/script-reference/unityengine/uielements/uxmlelementattribute/ctor.md#uxmlelementattribute\(string-type\)) | Declares a custom control with a custom element name and a list of supported child types. |

## Inheritance

**Inherited Members:**

* [Attribute.GetCustomAttributes(MemberInfo, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-memberinfo-system-type\))
* [Attribute.GetCustomAttributes(MemberInfo, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-memberinfo-system-type-system-boolean\))
* [Attribute.GetCustomAttributes(MemberInfo)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-memberinfo\))
* [Attribute.GetCustomAttributes(MemberInfo, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-memberinfo-system-boolean\))
* [Attribute.IsDefined(MemberInfo, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-memberinfo-system-type\))
* [Attribute.IsDefined(MemberInfo, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-memberinfo-system-type-system-boolean\))
* [Attribute.GetCustomAttribute(MemberInfo, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-memberinfo-system-type\))
* [Attribute.GetCustomAttribute(MemberInfo, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-memberinfo-system-type-system-boolean\))
* [Attribute.GetCustomAttributes(ParameterInfo)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-parameterinfo\))
* [Attribute.GetCustomAttributes(ParameterInfo, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-parameterinfo-system-type\))
* [Attribute.GetCustomAttributes(ParameterInfo, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-parameterinfo-system-type-system-boolean\))
* [Attribute.GetCustomAttributes(ParameterInfo, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-parameterinfo-system-boolean\))
* [Attribute.IsDefined(ParameterInfo, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-parameterinfo-system-type\))
* [Attribute.IsDefined(ParameterInfo, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-parameterinfo-system-type-system-boolean\))
* [Attribute.GetCustomAttribute(ParameterInfo, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-parameterinfo-system-type\))
* [Attribute.GetCustomAttribute(ParameterInfo, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-parameterinfo-system-type-system-boolean\))
* [Attribute.GetCustomAttributes(Module, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-module-system-type\))
* [Attribute.GetCustomAttributes(Module)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-module\))
* [Attribute.GetCustomAttributes(Module, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-module-system-boolean\))
* [Attribute.GetCustomAttributes(Module, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-module-system-type-system-boolean\))
* [Attribute.IsDefined(Module, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-module-system-type\))
* [Attribute.IsDefined(Module, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-module-system-type-system-boolean\))
* [Attribute.GetCustomAttribute(Module, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-module-system-type\))
* [Attribute.GetCustomAttribute(Module, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-module-system-type-system-boolean\))
* [Attribute.GetCustomAttributes(Assembly, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-assembly-system-type\))
* [Attribute.GetCustomAttributes(Assembly, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-assembly-system-type-system-boolean\))
* [Attribute.GetCustomAttributes(Assembly)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-assembly\))
* [Attribute.GetCustomAttributes(Assembly, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattributes#system-attribute-getcustomattributes\(system-reflection-assembly-system-boolean\))
* [Attribute.IsDefined(Assembly, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-assembly-system-type\))
* [Attribute.IsDefined(Assembly, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.isdefined#system-attribute-isdefined\(system-reflection-assembly-system-type-system-boolean\))
* [Attribute.GetCustomAttribute(Assembly, Type)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-assembly-system-type\))
* [Attribute.GetCustomAttribute(Assembly, Type, bool)](https://learn.microsoft.com/dotnet/api/system.attribute.getcustomattribute#system-attribute-getcustomattribute\(system-reflection-assembly-system-type-system-boolean\))
* [Attribute.Equals(Object)](https://learn.microsoft.com/dotnet/api/system.attribute.equals)
* [Attribute.GetHashCode()](https://learn.microsoft.com/dotnet/api/system.attribute.gethashcode)
* [Attribute.Match(Object)](https://learn.microsoft.com/dotnet/api/system.attribute.match)
* [Attribute.IsDefaultAttribute()](https://learn.microsoft.com/dotnet/api/system.attribute.isdefaultattribute)
* [Attribute.TypeId()](https://learn.microsoft.com/dotnet/api/system.attribute.typeid)
