dir.by  
  Поиск  
Программирование, разработка, тестирование
WPF. Windows Presentation Foundation (отдельное приложение exe файл)
В чем отличие static resource от dynamic resource ? | WPF C#
  Посмотрели 2116 раз(а)    
 В чем отличие static resource от dynamic resource ? | WPF C# 
последнее обновление: 19 июня 2024
1. Не используем static resource и dynamic resource
Я создал новый проект WPF Application...

Добавим TextBlock в файл MainWindow.xaml
А внутри текст Good morning! с зеленым фоном Background="Green"
 
  Xaml     Файл MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          xmlns:local="clr-namespace:WpfApp1"
          mc:Ignorable="d"
          Title="MainWindow" Height="450" Width="800">
     <Grid>

          <TextBlock
               Text="Good morning!"
               Background="{StaticResource MyColorForBooks}"
               FontSize="30"
               HorizontalAlignment="Center" VerticalAlignment="Center" />


     </Grid>
</Window>
Запустим приложение:
2. Используем static resource или dynamic resource
Добавим static resource или dynamic resource.

static resource и dynamic resource берут значение из ResourceDictionary

Отличия нет используем static resource или dynamic resource когда пишем в xaml файле.
 
  Xaml     StaticResource
<Window x:Class="WpfApp1.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          xmlns:local="clr-namespace:WpfApp1"
          mc:Ignorable="d"
          Title="MainWindow" Height="450" Width="800">

     <Window.Resources>
          <ResourceDictionary
 
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

               <SolidColorBrush
 
                   x:Key="MyColorForBooks"
                    Color="Green" />

          </ResourceDictionary>
     </Window.Resources>

         
     <Grid>

          <TextBlock
               Text="Good morning!"
               Background="{StaticResource MyColorForBooks}"
               FontSize="30"
               HorizontalAlignment="Center" VerticalAlignment="Center" />


     </Grid>
</Window>
  Xaml     DynamicResource
<Window x:Class="WpfApp1.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          xmlns:local="clr-namespace:WpfApp1"
          mc:Ignorable="d"
          Title="MainWindow" Height="450" Width="800">

     <Window.Resources>
          <ResourceDictionary
 
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

               <SolidColorBrush
 
                   x:Key="MyColorForBooks"
                    Color="Green" />

          </ResourceDictionary>
     </Window.Resources>

         
     <Grid>

          <TextBlock
               Text="Good morning!"
               Background="{DynamicResource MyColorForBooks}"
               FontSize="30"
               HorizontalAlignment="Center" VerticalAlignment="Center" />


     </Grid>
</Window>
Запустим приложение для static resource а потом для dynamic resource и увидим одинаковый результат:
3. В чем отличие static resource и dynamic resource?
Отличие static resource и dynamic resource в том что:

static resource нельзя менять во время выполнения программы.

dynamic resource можно менять во время выполнения программы.
4. dynamic resource меняем во время выполнения программы
Мы знаем что static resource и dynamic resource берут значение из ResourceDictionary

Вот так можно поменять значение для dynamic resource в ResourceDictionary:
  C#  
class MyUtils
{
     public static void ChangeColorBrushInResourceDictionary(ResourceDictionary resourceDictionary, string elemName, Color newColor)
     {
          resourceDictionary.BeginInit();
          var newBrush = new SolidColorBrush(newColor);
          resourceDictionary[elemName] = newBrush;
          resourceDictionary.EndInit();
     }
}
 
Напишем полный код:
Я создал новый проект WPF Application...
 
В файл MainWindow.xaml
добавил ResourceDictionary с именем myResourceDictionary1
добавил SolidColorBrush с ключем MyColorForBooks
  Файл MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          xmlns:local="clr-namespace:WpfApp1"
          mc:Ignorable="d"
          Title="MainWindow" Height="450" Width="800">

     <Window.Resources>
          <ResourceDictionary x:Name="myResourceDictionary1"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

               <SolidColorBrush
 
                   x:Key="MyColorForBooks"
                    Color="Green" />

          </ResourceDictionary>
     </Window.Resources>

         
     <Grid>

          <TextBlock
               Text="Good morning!"
               Background="{DynamicResource MyColorForBooks}"
               FontSize="30"
               HorizontalAlignment="Center" VerticalAlignment="Center" />


     </Grid>
</Window>
 
В файл MainWindow.xaml.cs
добавил метод ChangeColorBrushInResourceDictionary чтобы поменять значение для dynamic resource в ResourceDictionary

После инициализации InitializeComponent запускаю Timer
через 5 секунд выполнится OnTimer и поменяется цвет фона на синий.
  C#  
using System.Windows;
using System.Windows.Media;
using System.Timers;

namespace WpfApp1
{
     class MyUtils
     {
          public static void ChangeColorBrushInResourceDictionary(ResourceDictionary resourceDictionary, string elemName, Color newColor)
          {
               resourceDictionary.BeginInit();
               var newBrush = new SolidColorBrush(newColor);
               resourceDictionary[elemName] = newBrush;
               resourceDictionary.EndInit();
          }
     }

     public partial class MainWindow : Window
     {
          private readonly System.Timers.Timer _timer1;
          public MainWindow()
          {
               InitializeComponent();

               _timer1 = new System.Timers.Timer();
               _timer1.Interval = 5000; /*frequeny each 5 seconds*/
               _timer1.Elapsed += OnTimer;
               _timer1.Start();
          }

          void OnTimer(object sender, ElapsedEventArgs e)
          {
               _timer1.Stop();

               Dispatcher.Invoke(() => {
                    MyUtils.ChangeColorBrushInResourceDictionary(myResourceDictionary1, "MyColorForBooks", Color.FromRgb(0, 0, 255));
               });
          }
     }
}
На заметку!
Метод Dispatcher.Invoke делает так чтобы внутри содержимое (у нас это MyUtils.ChangeColorBrushInResourceDictionary) вызывалось в главном потоке.
Timer работает в другом потом и нельзя обращаться к ResourceDictionary в другом потоке..

  C#  
Dispatcher.Invoke(() => {
     MyUtils.ChangeColorBrushInResourceDictionary(myResourceDictionary1, "MyColorForBooks", Color.FromRgb(0, 0, 255));
});
 
Запускаем программу:
Сразу увидим:
а через 5 секунд увидим:
5. Какое применение в проектах чтобы менять dynamic resource во время выполнения программы ?
В комерческом WPF проекте на работе используется опция Day/Night.

Когда проект запущен вверху есть кнопка чтобы переключить на Night и фон сразу же становится темный.

Если вверху потом нажмем на кнопку Day фон становится светлый.

Так вот при нажатии на кнопку меняется dynamic resource
 
← Предыдущая тема
Пишем автоматический тест для WPF C# приложения (используем Nuget.Appium и свойство AutomationProperties.AutomationId)
 
Следующая тема →
Открываем окно свойств (properties) для графического элемента в WPF приложении C#
 
Ваши Отзывы ... комментарии ...
   
Вашe имя
Ваш комментарий (www ссылки может добавлять только залогиненный пользователь)

  Объявления  
  Объявления  
 
WPF простое новое приложение
Создаем новое WPF приложение | C#
WPF layout
Делаем layout с DockPanel и StackPanel в WPF
События
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на TextBlock"| координаты экрана и относительные координаты | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Button"| координаты экрана и относительные координаты | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Grid и рисуем линию"| C# WPF приложение
Пример "При двойном нажатии левой клавишей мыши на Grid показываем сообщение"| C# WPF приложение
WPF элементы
Label
Пример "Устанавливаем текст в Label" через c# код | WPF приложение
иконки FontAwesome
Пример "Показываю иконки, для иконки подключаю библиотеку fontawesome5" | C# WPF приложение
Пример "Делаю анимацию для иконки, библиотека fontawesome5" | C# WPF приложение
 
TextBlock
Пример "Устанавливаем текст в TextBlock используя Binding". Еще добавим двойной Bindning используя INotifyPropertyChanged | C# WPF приложение
Пример "Несколько TextBlock (показываем тексты) и делаем так чтобы при mouse move выделялся элемент где мышка (mouse over)" | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на TextBlock"| координаты экрана и относительные координаты | C# WPF приложение
Button
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Button"| координаты экрана и относительные координаты | C# WPF приложение
TextBox
Пример "Устанавливаем и получаем текст в TextBox используя Binding" | C# WPF приложение
Пример "Устанавливаем текст в TextBox" через c# код | WPF приложение
 
TextBox с Place Holder
Пример "Показываем Place Holder в TextBox" | WPF приложение
Пример "Показываем Place Holder с иконкой в TextBox", для иконки подключаю библиотеку fontawesome5 | WPF приложение
 
TextBox с проверкой текста (валидация)
Пример "Устанавливаем текст в TextBox используя Binding и делаем валидацию (если текст не правильный)" | C# WPF приложение
 
ComboBox
Пример "В ComboBox делаем редактирование текста. Получаем текст используя Binding" | C# WPF приложение
 
ItemsControl
Пример "ItemsControl, кнопка и обработчик нажатия" | WPF приложение
Grid
Что такое Grid в WPF
Как добавить RowDefinition, ColumnDefinition в Grid (мышкой в XAML design editor) | C# WPF приложение
В Grid добавляем vertical scrolling | WPF приложение
DataGrid
Пример "DataGrid делаем bind данных", кнопка и обработчик нажатия в DataGrid, выравнивание текста в DataGrid, scrolling | WPF приложение
Как сделать scrolling для DataGrid ? | C# WPF приложение
Scrolling для DataGrid (чтобы скролинг работал когда мы крутим колесо мышки и мышка находится вне scroll bar) | C# WPF приложение
Как выделить row цветом при нажатии на row мышкой (change background for selected row) в DataGrid ? | C# WPF приложение
Как row DataGrid выделить цветом (сделать background) ? | C# WPF приложение
Пример "DataGrid делаем сортировку колонки по своему алгоритму (Custom Sort)" | WPF приложение
DataGrid внутри DataGrid
Пример портфолио сотрудников с описанием задач: "DataGrid внутри DataGrid используя RowDetailsTemplate" | WPF приложение
 
ListView
Пример "В ListView расширяем колонку при добавлении данных (auto column width)" | WPF приложение
Пример "В ListView используем ItemTemplate DataTemplate" | WPF приложение
 
ScrollViewer
В Grid добавляем vertical scrolling | WPF приложение
Как сделать scrolling для DataGrid ? | C# WPF приложение
Scrolling для DataGrid (чтобы скролинг работал когда мы крутим колесо мышки и мышка находится вне scroll bar) | C# WPF приложение
Пример "Делаем ScrollBar меньше(больше) в ScrollViewer" | C# WPF приложение
Resource файл
Добавляем картинку (jpg, bmp, png) в проект и помечаем как Resource | C# WPF приложение
Image
В элементе Image показываем картинку (jpg, bmp, png) из Resource | C# WPF приложение
Выбираем картинку (jpg, bmp, png) из компьютера и показываем в элементе Image. Сохраняем картинку в базу данных | C# WPF приложение
Пример "В Image элементе делаем Binding для Source" | C# WPF приложение
Пример "Конвертируем текст base64 в картинку Bitmap и показываем в Image элементе" | C# WPF приложение
Пример "Открываем SVG файл и показываем картинку в Image элементе" | C# WPF приложение
 
Canvas
Пример "Создаем Canvas и рисуем картинку" C# WPF
Пример "Рисуем картинку с движением на Canvas" C# WPF
Пример "Рисуем картинку с движением и анимацией sprite на Canvas" C# WPF
 
Line
Рисуем Line (сплошная и штриховая линии) | C# WPF приложение
Пример "Создаем и рисуем линию при нажатии левой клавишей мыши на Grid"| Grid Line | C# WPF приложение
Конвертируем картинку в XAML Path Geometry
Конвертируем SVG в XAML(используя Adobe Illustrator), заполняем Path Data Geometry, показываем линии на экране | C# WPF приложение
Конвертируем SVG в XAML(используя Dias SVG to UWP XAML Converter), заполняем Path Data Geometry, показываем линии на экране | C# WPF приложение
Конвертируем PNG в SVG в XAML | C# WPF приложение
Converter SVG to XAML | WPF C#
Конвертируем XAML в SVG | C# WPF приложение
ViewBox
Пример "ViewBox делаем Binding для Left, Top, Width, Height, ContetnPresenter binding" | C# WPF приложение
Width by percentage
Разделить экран по вертикали (по ширине) на 2 равные части экран (width1 = 50%, width2 = 50%), используем Grid | C# WPF приложение
Разделить экран по вертикали (по ширине) на 2 части (width1 = 70%, width2 = 30%), используем Grid | C# WPF приложение
Пример "Устанавливаем ширину элемента в процентах от ширины родительского элемента" (width in percentage), пишем свой IValueConverter | C# WPF приложение
База данных (Entity Framework)
Entity Framework в приложении WPF. Используем Code First (пишем c# код, а таблицы в базе данных создаются сами)
Создаем свои WPF элементы
Пример "Создаем свой WPF элемент используя Style и новый xaml файл. Новый элемент это: вверху Title, внизу текст в рамке. Используем Binding | C# WPF приложение
Пример "Создаем свой новый WPF элемент со своими свойсвами в новом cs и xaml файлах. В WPF новом элементе: вверху Title, снизу текст и в рамке | C# WPF приложение
WPF приложение с библиотекой Prism (MVVM шаблон проектирования)
Создаем новое WPF приложение с Prism Unity (разделение проекта на папки Services, Views, ViewModels). Патерн MVVM (Model-View-ViewModel) | C#
WPF приложение с Prism Unity. В приложении Tab и разделения на отдельные xaml используя Region.
WPF приложение с Locator (MVVM шаблон проектирования)
Создаем новое WPF приложение с Locator (разделение проекта на папки Views, ViewModels)
Как добавить Dependency Injection, загрузку из appsettings.json в новом WPF приложении ?
Автоматические тесты
Пишем автоматический тест для WPF C# приложения (используем Nuget.Appium и свойство AutomationProperties.AutomationId)
Вопросы на собеседованиях
В чем отличие static resource от dynamic resource ? | WPF C#
Дополнительные темы, вопросы
Открываем окно свойств (properties) для графического элемента в WPF приложении C#
Ошибки
Ошибка "To run this application, you must install .NET. Would you like to download it now?" | Запускаю WPF приложение на C#
Книги
Книги для изучения WPF

  Ваши вопросы присылайте по почте: info@dir.by  
Яндекс.Метрика