Как определить и использовать ресурсы в xaml, чтобы их можно было использовать в С#
Теоретически, я думаю, что я могу определить Brushes and Colors и т.д. в файле xaml и назначить это кнопке buttonbackback в С#. Но как мне это сделать? Где я ставлю определение lineargradientbrush следующим образом:
<LinearGradientBrush x:Key="BlaBrush">
<GradientStop Offset="0" Color="Red"/>
<GradientStop Offset="1" Color="Green"/>
</LinearGradientBrush>
Просто поместите его в разные места в моем окне. xaml файл приводит к различным сообщениям об ошибках:/
Я нашел этот вопрос здесь в stackoverflow: Как использовать определенный ресурс кисти в XAML, начиная с С#, который объясняет его часть, но он, похоже, знает, где для определения кисти.
Я также попытался добавить шаблон shinyblue.xaml wpf в приложение и добавил <ResourceDictionary Source="ShinyBlue.xaml"/>
в application.resources в app.xaml. Это делает все мои кнопки синими мгновенно, но все же "вещи", определенные в shinyblue.xaml, как NormalBrush, недоступны из С# - по крайней мере, я не знаю, как это сделать.
Марк
Ответы
Ответ 1
Ваш xaml будет выглядеть примерно так:
MainWindow.xaml
<Window x:Class="BrushResource.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">
<Window.Resources>
<LinearGradientBrush x:Key="BrushOne" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="Silver" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
<LinearGradientBrush x:Key="BrushTwo" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="Maroon" Offset="0" />
<GradientStop Color="Silver" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Window.Resources>
<StackPanel>
<Button Content="Button" Width="100" Click="myButton_Click"/>
</StackPanel>
Чтобы назначить значение, вам нужно взять кисть градиента из таких ресурсов, как это:
MainWindow.xaml.cs
private void myButton_Click(object sender, RoutedEventArgs e)
{
(sender as Button).Background = this.Resources["BrushOne"] as LinearGradientBrush;
}
Ответ 2
Обратите внимание, что в существующих ответах говорится о размещении ресурсов в Window.Resources. Если вы хотите, чтобы ресурсы были доступны для всей системы, вы можете рассмотреть возможность добавления их в App.xaml или еще лучше, создать автономные словари ресурсов, которые могут быть включены в ваши представления и повторно использоваться в других местах (включая другие проекты)
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DefaultStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style x:Key="my_style" />
</ResourceDictionary>
</UserControl.Resources>
Ответ 3
Поместите их в коллекцию ресурсов одного из ваших элементов в XAML:
<Window ...>
<Window.Resources>
<LinearGradientBrush x:Key="BlaBrush">
<GradientStop Offset="0" Color="Red"/>
<GradientStop Offset="1" Color="Green"/>
</LinearGradientBrush>
<!-- Other resources -->
</Window.Resources>
<!-- Contents of window -->
</Window>
Затем введите их в код, используя FindResource
var blaBrush = this.FindResource("BlaBrush") as LinearGradientBrush;
Подробнее см. Обзор ресурсов.
Ответ 4
Вы можете получить доступ к ресурсам приложения как
Application.Current.Resources["BlaBrush"] as LinearGradientBrush
Или вы добавляете ресурс в ресурсы управления и получаете доступ к ним, как писал Quartermeister.