【发布时间】:2021-10-18 14:32:42
【问题描述】:
我正在尝试为 UWP 项目创建一个 UserControl,我希望在其中有一个用户正在使用的单元的指示器。
为了实现这一点,我创建了一个枚举并定义了控件将处理的单位类型,如下例所示:
public static class UnitEnum
{
public enum Unit
{
Size,
Weight,
Currency,
Percentage
}
}
然后,我在我的 UserControl 上创建了属性 ValueUnit,在将该控件添加到 UI 时应设置如下:
<usercontrols:NumericBox ValueUnit="Currency"/>
<usercontrols:NumericBox ValueUnit="Percentage"/>
<usercontrols:NumericBox ValueUnit="Size"/>
<usercontrols:NumericBox ValueUnit="Weight"/>
在 UserContol 内部,我有一个 switch case,其中指示符字符串发生变化以匹配该数据类型的系统默认单位(例如:货币 = €,大小 = M(来自米)),如下所示:
switch (ValueUnit)
{
case Unit.Currency:
UnitSymbol = System.Globalization.NumberFormatInfo.CurrentInfo.CurrencySymbol;
break;
case Unit.Percentage:
UnitSymbol = "%";
break;
case Unit.Size:
if (System.Globalization.RegionInfo.CurrentRegion.IsMetric) UnitSymbol = "m";
break;
case Unit.Weight:
if (System.Globalization.RegionInfo.CurrentRegion.IsMetric) UnitSymbol = "Kg";
break;
}
然后我将UnitSymbol绑定到对应的TextBlock:
<TextBlock Text="{x:Bind UnitSymbol}" VerticalAlignment="Center" Margin="5"/>
但在运行时,它总是显示与枚举的第一个值(在本例中为大小)相对应的符号,即使我已将 ValueUnit 设置为 XAML 中的任何其他值。
例子:
更新 1
我已经用ValueUnit == Currency 为UserControl 添加了一个名称,如下所示:
<usercontrols:NumericBox ValueUnit="Currency" x:Name="CurrencyBox"/>
在代码隐藏中,我添加了以下行并放置了一个断点:
var a = CurrencyBox.ValueUnit;
当应用程序停止在那条线上a = Size,CurrencyBox.ValueUnit = Currency,两者都派生自Enums.UnitEnum.Unit,当推进执行时a也更改为Currency,但最后它仍然向我显示大小符号(米)。
更新 2
经过一些测试,我发现UserControl 中的任何其他属性都不起作用,只有获得Strings 的属性。
例子:
<usercontrols:NumericBox Header="Teste" ValueUnit="Currency" HasCalc="True" x:Name="CurrencyBox"/>
-
Header(即string)正在工作。 ✅ -
ValueUnit(这是我的UnitEnum中的Unit)不起作用❌ -
HasCalc(这是正常的bool)不工作❌
UserControl 代码隐藏中的道具:
public string Header { get; set; }
public Unit ValueUnit { get; set; }
public bool HasCalc { get; set; }
此外,属性UnitSymbol (string) 正在工作,因为其中的值已显示。
【问题讨论】:
-
我认为
ValueUnit="Currency"无效。ValueUnit="Unit.Currency"听起来更像。请记住,枚举是编译时常量的集合。通常是integer 编译时间常数。如果没有有效值,系统通常必须默认设置。 -
我不确定您是否可以像在属性上那样直接设置枚举值。你是如何申报财产的?在WPF 中,您必须采取一些变通办法——也许 UWP 也是如此。
-
@fredrik
public Unit ValueUnit { get; set; } -
尝试使用 WPF 中的
{x:Static ..}看看是否可行。 -
@Christopher 我不知道这是不是真的,因为 IntelliSense 在我引入值时会识别 XAML 上的值,但我会尝试一下。
标签: c# windows visual-studio xaml uwp