diff --git a/MLEM.Ui/Elements/Element.cs b/MLEM.Ui/Elements/Element.cs
index d29e0c4..645cc08 100644
--- a/MLEM.Ui/Elements/Element.cs
+++ b/MLEM.Ui/Elements/Element.cs
@@ -313,6 +313,8 @@ namespace MLEM.Ui.Elements {
public GenericCallback OnTouchExit;
///
/// Event that is called when text input is made.
+ /// When an element uses this event, it should call on construction to ensure that a text input wrapper was set.
+ ///
/// Note that this event is called for every element, even if it is not selected.
/// Also note that if is true, this event is never called.
///
diff --git a/MLEM.Ui/Elements/TextField.cs b/MLEM.Ui/Elements/TextField.cs
index 1330fdb..4176ed0 100644
--- a/MLEM.Ui/Elements/TextField.cs
+++ b/MLEM.Ui/Elements/TextField.cs
@@ -132,6 +132,7 @@ namespace MLEM.Ui.Elements {
if (font != null)
this.Font.Set(font);
+ TextInputWrapper.EnsureExists();
if (TextInputWrapper.Current.RequiresOnScreenKeyboard()) {
this.OnPressed += async e => {
if (!KeyboardInput.IsVisible) {
diff --git a/MLEM.Ui/UiSystem.cs b/MLEM.Ui/UiSystem.cs
index 37e88c4..2754393 100644
--- a/MLEM.Ui/UiSystem.cs
+++ b/MLEM.Ui/UiSystem.cs
@@ -199,7 +199,8 @@ namespace MLEM.Ui {
root.Element.ForceUpdateArea();
};
- TextInputWrapper.Current.AddListener(window, (sender, key, character) => this.ApplyToAll(e => e.OnTextInput?.Invoke(e, key, character)));
+ if (TextInputWrapper.Current != null)
+ TextInputWrapper.Current.AddListener(window, (sender, key, character) => this.ApplyToAll(e => e.OnTextInput?.Invoke(e, key, character)));
this.OnMousedElementChanged = e => this.ApplyToAll(t => t.OnMousedElementChanged?.Invoke(t, e));
this.OnTouchedElementChanged = e => this.ApplyToAll(t => t.OnTouchedElementChanged?.Invoke(t, e));
this.OnSelectedElementChanged = e => this.ApplyToAll(t => t.OnSelectedElementChanged?.Invoke(t, e));
diff --git a/MLEM/Misc/TextInputWrapper.cs b/MLEM/Misc/TextInputWrapper.cs
index e9bade5..e3fb4a8 100644
--- a/MLEM/Misc/TextInputWrapper.cs
+++ b/MLEM/Misc/TextInputWrapper.cs
@@ -13,19 +13,20 @@ namespace MLEM.Misc {
///
public abstract class TextInputWrapper {
- private static TextInputWrapper current;
///
/// The current text input wrapper.
/// Set this value before starting your game if you want to use text input wrapping.
///
///
- public static TextInputWrapper Current {
- get {
- if (current == null)
- throw new InvalidOperationException("The TextInputWrapper was not initialized. For more information, see https://mlem.ellpeck.de/articles/ui.html#text-input");
- return current;
- }
- set => current = value;
+ public static TextInputWrapper Current;
+
+ ///
+ /// Ensures that is set to a valid value by throwing an exception if is null.
+ ///
+ /// If is null
+ public static void EnsureExists() {
+ if (Current == null)
+ throw new InvalidOperationException("The TextInputWrapper was not initialized. For more information, see https://mlem.ellpeck.de/articles/ui.html#text-input");
}
///