#windows-phone-7 #binding #resources
#windows-phone-7 #привязка #Ресурсы
Вопрос:
В App.xaml <Application.Resources>
У меня есть:
<Color x:Key="ColorMain">#FF1F879C</Color>
<SolidColorBrush x:Key="ColorBrushMain" Color="{StaticResource ColorMain}"/>
тогда у меня есть много шаблонов, которые используют эту кисть и цвет. Эти шаблоны используются во всем приложении.
Мне нужно иметь возможность изменять цвет, чтобы изменить обложку всего приложения. Мне нужно что-то вроде:
<SolidColorBrush x:Key="ColorBrushMain" Color="{Binding ColorMain}"/>
и в коде что-то вроде:
public string ColorMain {
get {
return ..... ; // "#FF803200";
}
}
Но это не работает. Пожалуйста, помогите.
UPD: abhinav прав, это должен быть цвет
public Color ColorMain {
get {
return ..... ; // return Color.FromArgb(0xFF, 0x80, 0x32, 0x00);
}
}
но этого недостаточно, это не обязательно. Я предполагаю, что это должно быть что-то вроде обычной страницы с DataContext
to ViewModel
, но что?
Ответ №1:
Если вы привязываетесь к свойству, в котором хранится цвет, и собираетесь изменять его во время выполнения и ожидать его обновления, разве вам не нужно также внедрять INotifyPropertyChanged ? Например:
public class MyViewModel: INotifyPropertyChanged
private Color _mainColor
public Color MainColor
{
get { return _mainColor; }
set
{
if (value != _mainColor)
{
_mainColor= value;
NotifyPropertyChanged("MainColor");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Итак: если вы ожидаете изменить цвет во время выполнения, используйте привязку и реализуйте INotifyPropertyChanged — если цвет не изменится во время выполнения, то то, что у вас уже есть, должно быть в порядке.
Комментарии:
1. Это верно. Вот как я бы поступил на обычной странице, которая является PhoneApplicationPage, и вы можете разместить это. DataContext=MyViewModel, но я спрашиваю, как мне это сделать из App.xaml, который является приложением и не имеет поля DataContext.
2. Речь идет не о DataContext, а об изменениях свойства DependencyProperty / notifying, поэтому вы должны иметь возможность обернуть свойство в App.xaml.cs, чтобы сделать то же самое. Эта ссылка также может помочь, а может и не помочь — forums.silverlight.net/t/229874.aspx/1
Ответ №2:
Вы привязываете свойство color к объекту string. Хотя я никогда не пробовал это, я совершенно уверен, что это не сработает.
Возможно, документация класса поможет. Смотрите эту ссылку.
Вы пробовали использовать вместо этого класс color?
public Color ColorMain {
get {
return ..... ; // "#FF803200";
}
}
Комментарии:
1. используйте метод Color FromArgb для преобразования вашего шестнадцатеричного значения в объект color. Посмотрите это .
2. Почему бы вам не добавить ресурс непосредственно в код формы?
Resources.Add("ColorMain", Color.FromARGB(a, r, g, b));
Все элементы управления, использующие этот ресурс, будут обновлены на следующей странице, на которую вы перейдете.