Привязка к StaticResource со свойством View Model в Xamarin.Forms? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть несколько пользовательских шрифтов, определенных в ResourceDictionary

<Application xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Fonlow.VA.App">
<Application.Resources>
    <ResourceDictionary>
        <OnPlatform x:TypeArguments="x:String" x:Key="SuperFont">
            <On Platform="Android" Value="Super.ttf#Super" />
            <On Platform="UWP" Value="/Assets/Super.ttf#Super" />
            <!--<On Platform="iOS" Value="OpenSans-Bold" />-->
        </OnPlatform>
        <OnPlatform x:TypeArguments="x:String" x:Key="NormalFont">
            <On Platform="Android" Value="Normal.ttf#Normal" />
            <On Platform="UWP" Value="/Assets/Normal.ttf#Normal" />
            <!--<On Platform="iOS" Value="OpenSans-Bold" />-->
        </OnPlatform>
    </ResourceDictionary>
</Application.Resources>

И

  <Label Text="{Binding CurrentOptotype.Text}" FontFamily="{StaticResource SuperFont}" FontSize="{Binding CurrentFontSize}" TextColor="Black" />

Пока все хорошо. Тем не менее, я бы переключил FontFamily во время выполнения через привязку ViewModel так же, как привязку для FontSize, поскольку CurrentFontSize является свойством в модели представления. Я пытался:

FontFamily="{Binding CurrentFontFamily}"

И значение CurrentFontFamily может указывать на существующий системный шрифт, но я хочу указать на пользовательский шрифт, указывающий на то, что определено в ResourceDictionary.

Я тогда попробовал:

FontFamily="{StaticResource {Binding CurrentFontFamily}}"

И очевидно, что во время выполнения возникает такая синтаксическая ошибка. Мне просто интересно, есть ли в XAML возможность переключать пользовательский шрифт во время выполнения через MVVM View Model?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

* * * * FontFamily="{Binding CurrentFontFamily}" в XAML - это то, что вам нужно для этого. Однако нет причины, по которой свойство CurrentFontFamily должно указывать на системный шрифт. Свойство Xamarin.Forms FontFamily - это просто строка, поэтому нет причин, по которым вы не должны делать что-то вроде:

// previous code...
CurrentFontFamily = (whateverCondition == something)
    ? (string)Application.Current.Resources["SuperFont"]
    : (string)Application.Current.Resources["NormalFont"];
0 голосов
/ 19 сентября 2018

Data Trigger - путь, как объяснено в https://blog.xamarin.com/triggers-in-xamarin-forms/. Следуя приведенному здесь примеру, теперь у меня есть:

                    <Label Text="{Binding CurrentText}"  Grid.Column="1" Margin="5,0,0,0"
                       FontSize="{Binding CurrentFontSize}" TextColor="Black"
                   HorizontalTextAlignment="Start" VerticalTextAlignment="Center">
                    <Label.Triggers>
                        <DataTrigger TargetType="Label"
                                     Binding="{Binding Source={x:Reference fontSelected}, Path=SelectedIndex}"
                                     Value="0">
                            <Setter Property="FontFamily" Value="{StaticResource NormalFont}"/>
                        </DataTrigger>
                        <DataTrigger TargetType="Label"
                                     Binding="{Binding Source={x:Reference chartSelected}, Path=SelectedIndex}"
                                     Value="1">
                            <Setter Property="FontFamily" Value="{StaticResource SuperFont}"/>
                        </DataTrigger>

                    </Label.Triggers>
                </Label>
0 голосов
/ 04 сентября 2018

Вы пробовали это?

FontFamily="{Binding CurrentFontFamily}"

Edit:

Вы можете сделать это с помощью конвертера:

public class FontConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var fontName = value as string;
        if(!Application.Current.Resources.ContainsKey(fontName))
            throw new KeyNotFoundException($"{fontName} not found in resources");
        return (string) Application.Current.Resources[fontName];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

В вашем App.xaml добавьте конвертер:

<Application.Resources>
    <ResourceDictionary>
        ....
        <extensions:FontConverter x:Key="FontConverter"/>
    </ResourceDictionary>
</Application.Resources>

Тогда вы можете связать свою собственность

FontFamily={Binding FontName, Converter={StaticResource FontConverter}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...