Как да скрия елемент, когато е на телефона?

Идеята е следната, вие създавате универсално приложение WinRT-XAML в Visual Studio 2013 Update 2 за Windows 8.1-Update и 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 на родителя на бутона с някаква стойност, конверторът няма да се задейства. Можете да решите това, като зададете 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