#c# #wpf #uwp #dependency-properties
#c# #wpf #uwp #свойства зависимости
Вопрос:
После переноса библиотеки классов WPF в библиотеку классов UWP следующий код выдает ошибку. Свойство PropertyType класса DependencyProperty работало в WPF. Я пытался получить помощь из Обзора свойств зависимостей аналогичного класса в UWP и этой онлайн-статьи, но немного запутался.
Чего мне здесь не хватает и как я могу заставить это работать?
Фрагмент кода [ошибка возникает в первой строке метода]:
using Windows.UI.Xaml;
using System.Reflection;
using Windows.UI.Xaml.Documents;
using System.ComponentModel;
....
private static void SetPropertyValue(XmlElement xamlElement, DependencyProperty property, string stringValue)
{
TypeConverter typeConverter TypeDescriptor.GetConverter(property.PropertyType);
try
{
object convertedValue = typeConverter.ConvertFromInvariantString(stringValue);
if (convertedValue != null)
{
xamlElement.SetAttribute(property.Name, stringValue);
}
}
catch(Exception)
{
}
}
Ошибка:
‘DependencyProperty’ не содержит определения для ‘PropertyType’, и не удалось найти доступного метода расширения ‘PropertyType’, принимающего первый аргумент типа ‘DependencyProperty’ (вам не хватает директивы using или ссылки на сборку?)
Снимок «ВСЕХ» установленных пакетов:
Комментарии:
1. Короче говоря, система. Windows. DependencyProperty не поддерживается в UWP или .NetStandrad 2.0. Поэтому вам нужно найти другие способы установки значения свойства в UWP.
Ответ №1:
Ниже приведен простой пример того, как вы можете использовать DependencyProperty
в UWP .
XAML
<Page x:Name="loginPage"
... >
<TextBlock Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>
C#
using Windows.UI.Xaml;
...
public string welcomeText
{
get { return (string)GetValue(welcomeTextProperty); }
set { SetValue(welcomeTextProperty, value); }
}
// Using a DependencyProperty as the backing store for welcomeText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty welcomeTextProperty =
DependencyProperty.Register("welcomeText", typeof(string), typeof(LoginPage), null);
В приведенном выше примере мы привязываем свойство dependency, welcomeText
которое мы определяем в коде, лежащем в основе (C #) , к a TextBlock
.
Пожалуйста, обратите внимание, ElementName=loginPage
это имя страницы, которое мы определяем в XAML.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ 1:
Насколько я могу понять из вашего кода, вы пытаетесь получить PropertyType
значение, чтобы преобразовать его в другой тип.
Для этого требования вы можете сделать что-то вроде этого:
В следующем примере у нас есть пользовательский преобразователь значений, который преобразует длину строки в Visibility
, другими словами, возвращает Visibility
на основе длины строки, которую он получает для преобразования, а также проверяет, соответствует ли value
предоставленный тип типу string
.
XAML
<Page x:Name="loginPage"
xmlns:converters="using:projectName.converters"
... >
<Page.Resources>
<converters:LengthToVisibilityConverter x:Key="lengthToVisibilityKey"></converters:LengthToVisibilityConverter>
</Page.Resources>
...
<TextBlock x:Name="flyoutTxt" Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>
<TextBlock Text="Has some text" Visibility="{Binding Path=Text,ElementName=flyoutTxt,Converter={StaticResource lengthToVisibilityKey}}"></TextBlock>
Здесь видимость второго TextBlock
основана на длине текста flyoutTxt
.
C#
Пользовательский класс конвертера для преобразования длины в видимость :
class LengthToVisibilityConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{ //checking if type of "value" is String and its length
if(value != null amp;amp; value.GetType() == typeof(string) amp;amp;
value.ToString().Length > 0)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
Пожалуйста, обратите внимание, что в зависимости от свойства, определенной выше, не требуется никаких изменений.
Комментарии:
1. Итак, как нам программно получить
PropertyType
значение DependencePropertywelcomeText
из вашего приведенного выше примера? Помните, ошибка в моем коде находится в следующей строке моего кода, в которой жалуется, что ‘DependencyProperty’ не содержит определения для ‘PropertyType’:TypeConverter typeConverter TypeDescriptor.GetConverter(property.PropertyType);
2. Вероятно, мне следует перефразировать сообщение. Вопрос в том, что у
DependenceProperty
класса вWPF
есть свойство, которое называетсяPropertyType
. НоDependenceProperty
класс вUWP
не обладает таким свойством. Итак, как нам справиться с этой ситуацией программно? Например, если у классаPerson
вWPF
есть свойство,LastName
вы можете получить к нему доступ черезPerson prs = new Person(), prs.LastName
. Но уPerson
класса вUWP
нет свойстваLastName
. Итак, когда мы преобразуемWPF
библиотеку классов вUWP
library, как мы обрабатываемLastName
свойство класса Person вUWP
?3. Хорошо .. теперь я понял, я неправильно понял вопрос.. Я не уверен, сможете ли вы заменить,
PropertyType
посколькуDependencyProperty
в UWP оно из Windows.Ui.xaml, где, как и в WPF, оно из другого пространства имен.