Как правильно реализовать UWP - PullRequest
0 голосов
/ 26 октября 2018

Я часто сталкиваюсь со многими проблемами, которые приводят к рефакторингу моего кода ...

Вот почему я хочу попросить некоторые рекомендации.

Проблемы, с которыми я сталкиваюсь:

1) Предоставление данных в XAML

Предоставление простых данных для управления значением вместо использования преобразователя значений. Например, у меня есть цветовая строка типа «# FF234243», которая хранится в классе. Значение строки предоставляется веб-приложением, поэтому я могу указать его только во время выполнения.

2) Интерфейс для каждого разрешения

В начале моего обучения мне сказали, что вы можете создать пользовательский интерфейс для каждого возможного разрешения, что глупо. Итак, я написал ValueConverter, который я связываю с элементом, и в качестве ConverterParameter я даю значение типа «300», которое вычисляется для каждого возможного разрешения ... Но это приводит к коду, подобному этому ...

<TextBlock
Height={Binding Converter={StaticResource SizeValue}, ConverterParameter='300'}
/>

3) DependencyProperties против NotifyProperties (свойства, которые реализуют INotifyPropertyChanged) против свойств

Я написал элемент управления, который принимает список значений и преобразует их в кнопки , которые можно активировать в пользовательском интерфейсе. Поэтому я сделал это так, я создал переменную, которую я установил как DataContext для этого конкретного Control , и проверил мои данные с помощью DataContextChanged , но мой коллега упомянул, что для этого Причина ЗависимостьСвойства , если введено. Таким образом, я создал DependecyProperty , который принимает список элементов НО , когда свойство получает значение, я должен отобразить кнопки ... Поэтому мне нужно будет сделать что-то вроде

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 голосов
/ 27 октября 2018

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

или

б) Укажите размер шрифта в пикселях. Это не пиксели, а эффективные пиксели. Они будут автоматически масштабироваться на разных устройствах:

https://docs.microsoft.com/en-us/windows/uwp/design/style/typography#size-and-scaling

Кроме того, используйте адаптивную компоновку , чтобы иметь разную компоновку для разных размеров экрана.

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/

Когда мне следует использовать свойства зависимостей в WPF?

Что такое свойство зависимости? Для чего он нужен?

Что такое свойство зависимостей?

INotifyPropertyChanged INPC являются центральной частью MVVM. Вы привязываете свой вид к viewModel, который реализует INPC, и когда вы изменяете значение элемента управления свойством, уведомляется и перечитывает новое значение.

Загрузите следующее видео в высоком разрешении, которое подробно объясняет MVVM (Лоран Бюньон): https://channel9.msdn.com/Events/MIX/MIX11/OPN03

MVVM: учебник от начала до конца?

Обычные свойства используются в модельных классах или когда нет необходимости уведомлять пользовательский интерфейс об изменениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...