如何正确实施UWP

时间:2018-10-26 18:23:14

标签: xaml uwp user-controls code-design

我经常遇到很多问题,导致重构代码...

这就是为什么我要提出一些建议。

我遇到的问题是:

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>

由于这些主题很多,我可以将它们分开,但是我认为这对于初学者来说是很常见的主题,我还没有找到解释或其他内容

1 个答案:

答案 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的属性)与属性

根据您的代码,您可以尝试使用ListViewItemsControl并定义自定义项目模板。

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有关更改的情况下使用。