【发布时间】:2019-03-31 13:06:02
【问题描述】:
我经常遇到许多导致我重构代码的问题...
这就是为什么我想请教一些建议。
我遇到的问题是:
1) 向 XAML 提供数据
提供简单的数据来控制值,而不是使用值转换器。例如,我有一个像“#FF234243”这样的颜色字符串,它存储在一个类中。该字符串的值由 Web 应用程序提供,因此我只能在运行时指定它。
2) 每种分辨率的用户界面
在我开始学习的时候,有人告诉我你可以为每一种可能的分辨率创建一个 UI,这很愚蠢。 所以我写了一个ValueConverter,我绑定在一个元素上,作为ConverterParameter,我给出一个像'300'这样的值,它会为每个可能的分辨率计算......但这会导致这样的代码......
<TextBlock
Height={Binding Converter={StaticResource SizeValue}, ConverterParameter='300'}
/>
3) DependencyProperties 与 NotifyProperties(实现 INotifyPropertyChanged 的属性)与属性
我编写了一个控件,它接受一个值列表并将它们转换为在 UI 中可点击的 按钮。所以我这样做了,我为这个特定的 Control 创建了一个变量,我将其设置为 DataContext 并使用 DataContextChanged 验证我的数据,但我的同事提到由于这个原因 DependencyProperties 被引入。所以我创建了一个 DependecyProperty ,它在属性获得值时获取项目列表 BUT 我必须呈现按钮......所以我必须做类似
public List<string> Buttons
{
get { return (List<string>)GetValue(ButtonsProperty); }
set
{
SetValue(ButtonsProperty, value);
RenderButtons();
}
}
// Using a DependencyProperty as the backing store for Buttons. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ButtonsProperty =
DependencyProperty.Register("Buttons", typeof(List<string>), typeof(MainPage), new PropertyMetadata(""));
private void RenderButtons()
{
ButtonBar.Children.Clear();
ButtonBar.ColumnDefinitions.Clear();
if(Buttons != null)
{
int added = 0;
foreach (var item in Buttons)
{
var cd = new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) };
var btn = new Button() { Content = item };
ButtonBar.ColumnDefinitions.Add(cd);
ButtonBar.Children.Add(btn);
Grid.SetColumn(btn, added);
}
}
}
并且必须像这样使用它:
<Controls:MyControl
x:Name="ButtonBar" Button="{Binding MyButtons}">
</Controls:MyControl>
由于这些主题很多,我可以将它们分开,但我认为这对于初学者来说是一个很常见的主题,我还没有找到解释或其他任何东西
【问题讨论】:
-
给出的每个主题都应该是 Stack Overflow 上的一个单独问题。
-
在第一个问题中,您的意思是避免使用值转换器并直接将十六进制颜色字符串与控件一起使用,不是吗?...十六进制颜色字符串是模型类的属性.. ??
-
@AshiqHassan 是的,它是一种十六进制颜色,但用户可以在 Web 应用程序中设置它的问题是它不是 ARGB 而是 RGB,所以它不能那么容易注册所以我想使用solidcolorbrush作为我页面的资源,真正的价值应该由一个类提供
标签: xaml uwp user-controls