Как скрыть элемент, когда он на телефоне?

Идея заключается в том, что вы создаете универсальное приложение WinRT-XAML в Visual Studio 2013 с обновлением 2 для Windows 8.1 с обновлением и Windows Phone 8.1. Вы используете одно и то же представление XAML для телефонов и планшетов. Вы используете конвергентный элемент управления CommandBar для отображения кнопок пользователю. В вашем приложении для Windows у вас есть 5 основных кнопок, но пользовательский интерфейс Windows Phone поддерживает только 4. Когда вы запускаете свое приложение в Windows Phone, вы понимаете, что 5-я кнопка удалена, но она удаляет кнопку завершения, а средняя кнопка — это та, которую вы хотите чтобы удалить. Вы не хотите менять порядок кнопок. Каковы ваши варианты, чтобы один UIElement был скрыт на телефоне, но виден на планшете?


person Jerry Nixon    schedule 06.05.2014    source источник


Ответы (1)


Вы можете справиться с этим многими способами. Если вам нужен надежный и многоразовый подход, вы можете использовать преобразователь видимости кнопки, которую хотите скрыть. XAML будет примерно таким:

<Page.Resources>
    <Converters:HiddenWhenPhoneConverter x:Name="HidePhone" />
</Page.Resources>
<Button Visibility="{Binding, Converter={StaticResource PhoneHide}}" />

Тогда у вас будет конвертер примерно такой:

public class HiddenWhenPhoneConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
#if WINDOWS_PHONE_APP
        return Visibility.Collapsed;
#else
        return Visibility.Visible;
#endif
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    { throw new NotImplementedException(); }
}

public class VisibleWhenPhoneConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
#if WINDOWS_PHONE_APP
        return Visibility.Visible;
#else
        return Visibility.Collapsed;
#endif
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    { throw new NotImplementedException(); }
}

Помните: с точки зрения производительности это будет выполняться только при загрузке представления. Таким образом, это должно быть минимальное воздействие и дать вам желаемые результаты. Есть еще одна вещь. Если вы не установили Button или DataContext родительского элемента Button с каким-либо значением, преобразователь не сработает. Вы можете решить эту проблему, установив DataContext="{x:Null}" для кнопки или ее родителя. Но в большинстве случаев вы используете MVVM и уже установили DataContext, так что это спорно.

person Jerry Nixon    schedule 06.05.2014
comment
Это также рекомендуется для командных панелей? У меня нет большого опыта работы с ними, но я думаю, что видел, что они должны были автоматически перекомпоновываться в контекстное/выпадающее меню, когда места не хватает? - person Filip Skakun; 07.05.2014
comment
Я не могу найти лучшего способа, кроме отдельного интерфейса. Работать с разными размерами не так уж и просто. Очень жаль. Это то, что есть, я думаю. - person Jerry Nixon; 07.05.2014
comment
Я шпионю за возможностями для новых адаптивных элементов управления макетом... :) - person Filip Skakun; 07.05.2014