【问题标题】:How to implement UWP the right way如何以正确的方式实施 UWP
【发布时间】: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


【解决方案1】:

1.向 XAML 提供数据

有两种选择:在 ViewModel 中准备数据或使用转换器。 在我看来,使用转换器会更好,因为您可以使用示例中提到的颜色的跨平台视图模型,并且转换器将创建与平台相关的颜色。我们对图像有类似的问题。在 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 有关更改的情况。

【讨论】:

  • 由于这些来源很多,我会尽快查看它们。如果我接受您的回答,我应该将这些主题拆分为 3 个帖子并将它们链接到说明中,以便您了解您的观点,还是应该将其保留为单个帖子,以便其他用户看到这些是相关问题?
  • 关于问题3中的listview:我的问题是我提供了设置columnindexes fpr按钮的选项,以便它们可以是同一位置的两个按钮,但on是可见的,另一个是折叠的.可以通过轻松访问列表并设置其状态来更改其状态,而不是更改完整列表并强制更新 UI。但是,如果我只是在性能和​​维护方面更改源,会有所不同
  • @MelloPs 您可以拆分您的问题,以防您对答案不满意。以后不要创建问题列表,因为新用户将无法找到答案,因为您的标题没有与问题相关的特定关键字。
  • @MelloPs 至于第三个问题,可以自定义控件,但依赖属性应该是命令列表,而不是按钮列表。如果您查看 ListView 实现,它们没有控件列表,而是控件的数据(项目)列表。
  • 现在我正在尝试通过 TuTs 工作,但这个答案已经帮助了我很多。非常感谢。
猜你喜欢
  • 2021-11-02
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多