58 lines
1.9 KiB
Markdown
Raw Permalink Normal View History

2024-10-12 17:19:46 +08:00
# BindWidgetOptional
- **功能描述:** 指定在C++类中该Widget属性可以绑定到UMG的某个同名控件也可以不绑定。
- **使用位置:** UPROPERTY
- **引擎模块:** Widget Property
- **元数据类型:** bool
- **限制类型:** UWidget子类里属性
- **关联项:** [BindWidget](../BindWidget/BindWidget.md)
- **常用程度:** ★★★
指定在C++类中该Widget属性可以绑定到UMG的某个同名控件也可以不绑定。
大致作用和BindWidget一样区别是
- BindWidgetOptional顾名思义是可选的意思是UMG里即使不定义该控件在编译的时候也不会报错。编译会通过但是会提示警告缺少控件。
-
- 和不加BindWidgetOptional的控件同名属性的区别是前者在UMG里定义同名控件的时候不会报错但后者是会提示同名冲突报错。
BindWidgetOptional的写法有两种
BindWidgetOptional可以看作是BindWidget和OptionalWidget的合并版。
```cpp
UCLASS(BlueprintType)
class INSIDER_API UMyProperty_BindWidget :public UUserWidget
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
class UTextBlock* MyTextBlock_SameName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidgetOptional))
class UTextBlock* MyTextBlock_Optional1;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidget, OptionalWidget))
class UTextBlock* MyTextBlock_Optional2;
};
```
## 测试效果:
![Untitled](Untitled.png)
## 原理:
```cpp
bool FWidgetBlueprintEditorUtils::IsBindWidgetProperty(const FProperty* InProperty, bool& bIsOptional)
{
if ( InProperty )
{
bool bIsBindWidget = InProperty->HasMetaData("BindWidget") || InProperty->HasMetaData("BindWidgetOptional");
bIsOptional = InProperty->HasMetaData("BindWidgetOptional") || ( InProperty->HasMetaData("OptionalWidget") || InProperty->GetBoolMetaData("OptionalWidget") );
return bIsBindWidget;
}
return false;
}
```