×
=0) { let js = text.slice(pos1, pos2); + '<\/' + "script" + '>'; arrText.push(js); // next pos1 = pos2; continue; } } } break; } return arrText; } function OpenDialog(parentDiv, urlContent) { parentDiv = document.getElementById('modal-background'); // new !!!!!!! parentDiv.appendChild(document.getElementById('modal-template')); document.getElementById('modal-background').style.display = "block"; document.getElementById('modal-template').style.display = "flex"; // !!!!! document.getElementById('modal-body').innerHTML = ""; post_url(urlContent, "", function(text_from_server) { var element = document.getElementById('modal-body'); element.innerHTML = text_from_server; // add scripts var arrJSText = get_scripts(text_from_server); for (var i=0; i
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