Подтвердить что ты не робот

Установить управление Фоновый цвет с использованием динамического ресурса в WPF?

Это мой XAML

<Grid.Resources>
            <SolidColorBrush x:Key="DynamicBG"/>
</Grid.Resources>
<Label name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG} />

У меня есть два вопроса:

Q1: Как мне изменить значение ключа DynamicBG на Красный в моем коде? (Когда окно загружается, я хотел бы установить его на красный)

Q2: Является ли это тем, как предполагается использовать динамические ресурсы?

Спасибо

4b9b3361

Ответ 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 происходит слишком рано.