Установить управление Фоновый цвет с использованием динамического ресурса в WPF?
Это мой XAML
<Grid.Resources>
<SolidColorBrush x:Key="DynamicBG"/>
</Grid.Resources>
<Label name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG} />
У меня есть два вопроса:
Q1: Как мне изменить значение ключа DynamicBG
на Красный в моем коде? (Когда окно загружается, я хотел бы установить его на красный)
Q2: Является ли это тем, как предполагается использовать динамические ресурсы?
Спасибо
Ответы
Ответ 1
Чтобы получить доступ к Resource
кода, необходимо идентифицировать их в файле App.xaml
:
<Application.Resources>
<SolidColorBrush x:Key="DynamicBG" />
</Application.Resources>
XAML example
<Grid>
<Label Name="MyLabel"
Content="Hello"
Background="{DynamicResource DynamicBG}" />
<Button Content="Change color"
Width="100"
Height="30"
Click="Button_Click" />
</Grid>
Resource
можно изменить в строке кода формы:
Application.Current.Resources["MyResource"] = MyNewValue;
Пример:
Code behind
// using ContentRendered event
private void Window_ContentRendered(object sender, EventArgs e)
{
SolidColorBrush MyBrush = Brushes.Aquamarine;
// Set the value
Application.Current.Resources["DynamicBG"] = MyBrush;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
SolidColorBrush MyBrush = Brushes.CadetBlue;
// Set the value
Application.Current.Resources["DynamicBG"] = MyBrush;
}
Принцип, DynamicResources
был спроектирован, поэтому их можно изменить. Где менять - это задача разработчика. В случае Color
это один из наиболее распространенных методов. Для получения дополнительной информации см. MSDN.
Р. S. Я рекомендую использовать App.xaml
, потому что были случаи, когда StaticResource
был успешно использован, но не DynamicResource
(ресурсы размещены в Window.Resources
). Но после перемещения ресурса в App.xaml
все приступило к работе.
Ответ 2
A1:
Вы должны переместить "DynamicBG" в ресурс окна, после чего вы можете использовать свойство Resources
в обработчике событий Loaded
:
XAML:
<Window x:Class="MyLabelDynamicResource.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
Loaded="Window_Loaded">
<Window.Resources>
<SolidColorBrush x:Key="DynamicBG"/>
</Window.Resources>
<Grid>
<Label Name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG}" />
</Grid>
</Window>
Code-за:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.Resources["DynamicBG"] = new SolidColorBrush(Colors.Red);
}
}
A2:
Вы должны использовать динамические ресурсы, когда хотите изменить свойство во время выполнения.
Ответ 3
A2: нет. Чтобы делать то, что вы делаете, лучше использовать привязку данных. У вас есть свойство в вашей модели просмотра, указывающее, загружено ли оно, затем привяжите фон к нему с помощью подходящего конвертера или используйте триггер. (Если это виртуальный пользовательский интерфейс, который загружается, добавьте свойство в окно.) Динамические ресурсы используются для тематики и с шаблонами, в редких случаях, когда поиск StaticResource происходит слишком рано.