Настройка размера элемента управления записью MAUI XAML для однозначного отображения

Я работаю над приложением .NET MAUI и столкнулся с проблемой настройки пользовательского интерфейса элементов управления записью XAML. Я стремлюсь создать дисплей цифровых часов, где каждая цифра отображается в отдельном элементе управления Entry, как показано на эталонном изображении.

Целью дизайна является то, чтобы каждый элемент управления Entry был достаточно широким, чтобы удобно отображать одну цифру, центрированную как по горизонтали, так и по вертикали в представлении.

Однако я столкнулся с проблемой, из-за которой установка ширины элемента управления Entry меньше минимального значения по умолчанию приводит к тому, что цифра частично отображается «за кадром». Похоже, что существуют внутренние отступы или поля, определяющие этот минимальный размер, и любая попытка установить меньший размер приводит к тому, что элемент управления отображает только видимую часть, тем самым обрезая содержимое.

Вот что я пробовал до сих пор:

Установка для свойства WidthRequest значения, которое в идеале соответствует одной цифре. Настройка свойств отступов и полей на 0 или даже на отрицательные значения. Экспериментируйте с HorizontalOptions и VerticalOptions, чтобы центрировать текст. К сожалению, ни один из этих методов не помог решить проблему. Текст по-прежнему кажется сдвинутым к краю элемента управления, как будто существует невидимая граница, которая не позволяет ему полностью центрироваться при уменьшении размера.

Может ли кто-нибудь дать представление о том, как переопределить это ограничение минимального размера для элементов управления Entry в MAUI XAML? Или есть лучший подход к созданию такого элемента пользовательского интерфейса, который будет служить цифровым дисплеем цифровых часов?

Я специально ищу решение, которое соответствует лучшим практикам MAUI и по возможности избегает использования пользовательских средств визуализации.

Вот XAML, который я пытаюсь использовать

<ContentView
  xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
  xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
  xmlns:local = "clr-namespace:XTConnect.Core.CustomControls.CompositeNumericEntry.Views"
  x:Class = "XTConnect.Core.CustomControls.CompositeNumericEntry.Views.CompositeNumericEntryView"
  xmlns:u = "clr-namespace:XTConnect.Core.Utilities;assembly=XTConnect.Core"
  x:DataType = "local:CompositeNumericEntryView">

  <Grid
    ColumnDefinitions = "30,30,30,30,30,30,30,30,30,30"
    HorizontalOptions = "Center"
    BackgroundColor = "White"
    ColumnSpacing = "0">
    <Grid.Resources>
      <Style
        x:Key = "SingleDigitEntryStyle"
        TargetType = "u:SingleDigitEntry">
        <Setter Property = "BorderThickness" Value = "0"/>
        <Setter Property = "CornerRadius" Value = "0"/>
        <Setter Property = "HorizontalTextAlignment" Value = "Start"/>
        <Setter Property = "VerticalTextAlignment" Value = "End"/>
        <Setter Property = "Margin" Value = "0"/>
        <Setter Property = "TextColor" Value = "Black"/>
        <Setter Property = "BackgroundColor" Value = "White"/>
        <Setter Property = "FontSize" Value = "20"/>
        <Setter Property = "FontFamily" Value = "Monofonto"/>
        <Style.Triggers>
          <Trigger TargetType = "u:SingleDigitEntry" Property = "IsFocused" Value = "True">
            <Setter Property = "BackgroundColor" Value = "Gray"/>
            <Setter Property = "TextColor" Value = "Red"/>
          </Trigger>
        </Style.Triggers>
      </Style>
    </Grid.Resources>
    <u:SingleDigitEntry Grid.Column = "0" x:Name = "Entry0" AutomationId = "Entry0" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "1" x:Name = "Entry1" AutomationId = "Entry1" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "2" x:Name = "Entry2" AutomationId = "Entry2" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "3" x:Name = "Entry3" AutomationId = "Entry3" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "4" x:Name = "Entry4" AutomationId = "Entry4" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "5" x:Name = "Entry5" AutomationId = "Entry5" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "6" x:Name = "Entry6" AutomationId = "Entry6" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "7" x:Name = "Entry7" AutomationId = "Entry7" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "8" x:Name = "Entry8" AutomationId = "Entry8" Style = "{StaticResource SingleDigitEntryStyle}"/>
    <u:SingleDigitEntry Grid.Column = "9" x:Name = "Entry9" AutomationId = "Entry9" Style = "{StaticResource SingleDigitEntryStyle}"/>
  </Grid>
</ContentView>

SingleDigitEntry является производным от элемента управления Telerik RadEntry, но с тем же успехом может быть и стандартным Entry, они ведут себя точно так же.

Самый близкий к этому макету, который мне удалось подобрать, используя только доступные размеры, показан ниже...

Если я еще уменьшу ширину, видимая область элементов управления начнет обрезаться, а текст станет не по центру.

Вы пытались установить Минимальную ширину запроса для записи? Или вы пытались использовать сетку для размещения записи?

Liyun Zhang - MSFT 15.04.2024 07:51

Я пробовал оба Лиюнь. Кажется, что сетка работает лучше всего, но ее недостаточно для воссоздания существующего пользовательского интерфейса. Возможно, нам удастся его купить, но было бы неплохо, чтобы он выглядел точно так же, как оригинал, который мы имитируем.

Sean Bennington 16.04.2024 21:04

Вы также можете попытаться установить заполнение собственного представления равным 0, как это было сделано в ответе ниже.

Liyun Zhang - MSFT 18.04.2024 11:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался воспроизвести ошибку, с которой вы столкнулись на Android, используя следующие значения, и на самом деле я обнаружил, что записи имеют заполнение по умолчанию, которое можно отключить (по крайней мере, в Android):

<Entry
    BackgroundColor = "#80000000"
    HorizontalOptions = "Center"
    HorizontalTextAlignment = "Center"
    Text = "0"
    TextColor = "White"
    VerticalOptions = "Center"
    VerticalTextAlignment = "Center"
    WidthRequest = "10" />

Чтобы отключить его, мне пришлось поместить следующую строку в app.xaml.cs

Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("MyCustomization", (handler, view) =>
{
#if ANDROID

    handler.PlatformView.SetPadding(0, 0, 0, 0);

#endif
});

Обычный вход:

Без заполнения. Запись:

Вероятно, есть способ сделать то же самое на всех других платформах.

Другие вопросы по теме