我在WPF项目中工作,它拥有大量的用户控件。 对于某些表单,当用户关闭容器选项卡时,会显示确认关闭,对于其他表单,它们只是关闭。 所以我用
FrmAccounts FrmAcc = new FrmAccounts {Tag = "showConfirmClose"};
决定我需要关闭哪个标签。
并在结束时检查标签是否设置为showConfirmClose
以显示确认消息。但我不喜欢使用Tag
它在C#中表现不佳,我也想,如果我想发送更多数据怎么办(唯一的解决办法就是用逗号分隔它们在标签和Split
他们,但这更糟糕。)
我找不到一个好的,高效的方法来完成这样的任务: 如果可能的话:
FrmAccounts FrmAcc = new FrmAccounts {new{ShowConfirmClose= true }};
答案 0 :(得分:0)
您可以使用AttachedProperty
存储对象的其他信息。但是,这些对象必须是DependencyObject
s,否则它将无法正常工作。
这是一个例子。
在单独的类中定义附加属性(它可以是简单的static
类或DependencyObject
):
namespace YourNamespace
{
public static class CloseConfirmation
{
public static readonly DependencyProperty IsActiveProperty = DependencyProperty.RegisterAttached(
"IsActive",
typeof(bool),
typeof(CloseConfirmation));
public static bool GetIsActive(DependencyObject obj)
{
return (bool)obj.GetValue(HiddenProperty);
}
public static void SetIsActive(DependencyObject obj, bool value)
{
obj.SetValue(HiddenProperty, value);
}
}
}
在XAML中,为对象设置附加属性值(WPF Window
s,Page
和其他DependencyObjects
}:
<FrmAccounts xmlns:yns="YourNamespace"
yns:CloseConfirmation.IsActive="true">
<!-- Content -->
</FrmAccounts>
您可以在XAML定义中使用此附加属性,例如在触发器中。
您还可以在代码隐藏中访问其值:
FrmAccounts frm = new FrmAccounts();
CloseConfirmation.SetIsActive(frm, true);
var isActive = CloseConfirmation.GetIsActive(frm); // true
您不仅可以为bool
或int
之类的简单类型创建附加属性,还可以为任何自定义类型创建附加属性。因此,如果需要传输大量数据,请使用自己的容器类。
在.NET中使用Tag
完全正常。实际上,任何UI类型都具有此属性,因此您可以将任何类型的对象附加到UI元素。但是,这些类型不能是匿名类型。您必须创建自己的容器类型:
class Container
{
public bool IsConfirmationNeeded { get; }
public IEnumerable<IItem> MyData { get; } // any data you need to pass
}
FrmAccounts frm = new FrmAccounts();
frm.Tag = new Container();
var container = (Container)frm.Tag;
var confirmation = container.IsConfirmationNeeded; // false by default