Как получить стиль из словаря ресурсов в коде в UserControlLibrary?
У меня есть библиотека управления пользователями с некоторыми словарями ресурсов. Код:
<ResourceDictionary ... >
<LinearGradientBrush x:Key="MyButtonBackground" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF654073" Offset="0.084"/>
<GradientStop Color="#FF8A6093" Offset="0.929"/>
</LinearGradientBrush>
<Style x:Key="MyButtonStyle" TargetType="{x:Type MyButton}" >
<Setter Property="Background" Value="{StaticResource ResourceKey=MyButtonBackground}" />
<Setter Property="Foreground" Value="White" />
</Style>
</ResourceDictionary>
Тогда у меня есть класс для загрузки словаря ресурсов. В принципе:
return (ResourceDictionary)Application.LoadComponent(new System.Uri("/MyAssembly;component/Themes/Default.xaml", System.UriKind.Relative))
Теперь в классе User Control после получения Resource Dictionary я хочу загрузить стиль напрямую. Как я могу это сделать?
this.Style = ((Style)MyResourceDictionary["MyButtonStyle"]); // Don't work
Тем не мение:
this.Background = ((Brush)MyResourceDictionary["MyButtonBackground"]); // Works
1 ответ
Какое исключение вы получаете за первое? На основании вашего описания, если this
это UserControl
вы получаете исключение, потому что Style
вы пытаетесь подать заявление применимо только к MyButton
,
Если вы пытаетесь создать кастом Control
в WPF (который имеет совсем другой подход, чем UserControl
), то вы делаете больше работы, чем нужно.
Во-первых, вы должны создать свой собственный элемент управления как класс (без страницы XAML):
public class MyButton : Button
{
static MyButton()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(MyButton),
new FrameworkPropertyMetadata(typeof(MyButton)));
}
}
А потом, в вашем RessourceDictionary
, удалить x:Key
от Style
:
<Style TargetType="{x:Type MyButton}" >
<Setter Property="Background" Value="{StaticResource ResourceKey=MyButtonBackground}" />
<Setter Property="Foreground" Value="White" />
</Style>
Наконец, ваш ResourceDictionary
должен быть включен в Project_Root\Themes\generic.xaml
тематический словарь. Тогда вам вообще не нужно будет получать ресурсы из кода.
Для дальнейшего чтения у CodeProject есть довольно хорошее руководство по созданию пользовательского элемента управления WPF.