我经常遇到很多问题,导致重构代码...
这就是为什么我要提出一些建议。
我遇到的问题是:
1)向XAML提供数据
提供简单数据来控制值,而不使用值转换器。例如,我有一个类似“#FF234243”的颜色字符串,它存储在一个类中。字符串的值由Web应用程序提供,因此我只能在运行时指定它。
2)每种分辨率的用户界面
在我开始学习时,我被告知您可以为每种可能的解决方案创建一个UI,这很愚蠢。 因此,我编写了一个ValueConverter,将其绑定到一个元素上,并使用ConverterParameter给出了一个像'300'这样的值,该值会针对每种可能的分辨率进行计算...但这会导致这样的代码...
<TextBlock
Height={Binding Converter={StaticResource SizeValue}, ConverterParameter='300'}
/>
3)DependencyProperties与NotifyProperties(实现INotifyPropertyChanged的属性)与属性
我编写了一个控件,该控件接受一个值列表,并将其转换为在用户界面中可单击的 Button 。所以我做到了,我为此特定的 Control 创建了一个设置为 DataContext 的变量,并使用 DataContextChanged 验证了我的数据,但我的同事提到了因此引入了 DependencyProperties 。因此,我创建了一个 DependecyProperty ,当属性获取值时,该列表会获取项目 BUT 的列表,因此我必须呈现按钮...因此,我必须执行< / p>
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>
由于这些主题很多,我可以将它们分开,但是我认为这对于初学者来说是很常见的主题,我还没有找到解释或其他内容
答案 0 :(得分:3)
1。向XAML提供数据
有两个选项:在ViewModel中准备数据或使用转换器。 在我看来,使用Converter会更好,因为您可以拥有示例中提到的颜色的跨平台viewModel,并且Converter会创建平台相关的颜色。我们在图像上也有类似的问题。在android上,应将其转换为Bitmap类,而在UWP上,应将其转换为BitmapImage类。在viewModel中,我们有byte []。
2。每种分辨率的用户界面
您不需要使用转换器,因为以有效像素指定了高度,该高度将自动适合您所有需要的分辨率。可以在以下链接中找到更多信息:
https://docs.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml
有两种方法可以处理文本块大小:
a)使用预定义的文本块样式,并且不要发明轮子(建议的选择):
https://docs.microsoft.com/en-us/windows/uwp/design/style/typography#type-ramp
或
b)以像素为单位指定字体大小。它们不是像素,而是有效像素。它们将在不同设备上自动缩放:
https://docs.microsoft.com/en-us/windows/uwp/design/style/typography#size-and-scaling
此外,使用adaptive layout对不同的屏幕尺寸使用不同的布局。
3)DependencyProperties与NotifyProperties(实现INotifyPropertyChanged的属性)与属性
根据您的代码,您可以尝试使用ListView或ItemsControl并定义自定义项目模板。
DependencyProperties在DependencyObject中创建,并且可以在xaml中访问。所有控件都从DependencyObjects继承。通常,您要在xaml中设置它们时创建它们。它们不是直接存储在对象中,而是存储在全局字典中,并在运行时解析。
DependencyProperties是很久以前创建的,您可以找到许多链接来详细解释它们:
http://www.wpftutorial.net/dependencyproperties.html
https://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/
When should I use dependency properties in WPF?
What is a dependency property? What is its use?
What is a dependency property?
INotifyPropertyChanged INPC是MVVM的核心部分。您将视图绑定到实现INPC的viewModel上,并在更改属性控件的值时收到通知并重新读取新值。
以高分辨率下载以下视频,详细介绍MVVM(由Laurent Bugnion撰写): https://channel9.msdn.com/Events/MIX/MIX11/OPN03
MVVM: Tutorial from start to finish?
普通属性用于模型类中,或者在不需要通知UI有关更改的情况下使用。