我有资源字典文件(MenuTemplate.xaml,ButtonTemplate.xaml等),我想在多个单独的应用程序中使用.我可以将它们添加到应用程序的程序集中,但如果我在一个程序集中编译这些资源并让我的应用程序引用它,那就更好了吧?
构建资源程序集后,如何在我的应用程序的App.xaml中引用它?目前,我使用ResourceDictionary.MergedDictionaries来合并各个字典文件.如果我在一个程序集中有它们,我怎么能在xaml中引用它们?
我有一些WPF应用程序,我希望我的所有样式都在共享程序集中,而不是分别在每个应用程序中声明它们.
我正在寻找一种方法,所以我不必改变我Style="{StaticResource BlahBlah}"现有的应用程序; 我只想添加对此样式程序集的引用,并将其从当前应用程序中删除,因此它从程序集中获取.
有什么办法吗?
我有一个库,CommonLibraryWpfThemes,里面有几个Resource Dictionary XAML文件.My Themes/Generic.xml文件包含一个ResourceDictionary.MergedDictionaries声明,它将所有其他文件合并在一起.
Generic.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/BrushDictionary.xaml" />
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/TextBlockDictionary.xaml" />
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/LabelDictionary.xaml" />
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/ButtonDictionary.xaml" />
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
在我的应用程序项目中,我引用了CommonLibraryWpfThemes,并在我的App.xaml文件中显式引用了Generic.xml.
App.xaml - 失败
<Application
x:Class="MyApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" />
</Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)
这不起作用.运行我的应用程序时出现以下错误:
System.Windows.Markup.XamlParseException occurred
Message="Cannot find resource named '{_fadedOrangeBrush}'. Resource names are case sensitive. Error at object 'System.Windows.Setter' in markup file 'CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml' Line 18 Position 13."
Source="PresentationFramework"
LineNumber=18
LinePosition=13
Run Code Online (Sandbox Code Playgroud)
如果我直接将Generic.xaml的内容放入App.xaml,一切正常:
App.xaml - SUCCEEDS
<Application
x:Class="MyApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary …Run Code Online (Sandbox Code Playgroud) 我声明了一个我想要应用于项目中所有按钮的样式,样式位于ResourceDictionary中:
<Style TargetType="StackPanel">
<Setter Property="Orientation" Value="Horizontal" />
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
现在,在某些窗口中,我想继承此样式但添加一个值:
<Style TargetType="StackPanel">
<Setter Property="Margin" Value="5"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
问题是它不会继承全局样式,为了继承我必须为全局样式分配一个键:
<Style TargetType="StackPanel" x:Key="StackPanelStyle" />
Run Code Online (Sandbox Code Playgroud)
然后在窗口的XAML继承(或/和覆盖 - 可选)它:
<Style TargetType="StackPanel" BasedOn="StackPanelStyle" />
Run Code Online (Sandbox Code Playgroud)
问题是如果你分配一个密钥,它不是全局的,你必须在每个窗口/范围上调用它.
我的问题的解决方案应该是两个中的一个(还有什么我错过了吗?):
我想重新声明命名样式(在ResourceDictionary中)附近实际工作的样式:
<!--In the ResourceDictionary-->
<Style x:Key="StackPanelStyle" TargetType="StackPanel">
<Setter Property="Orientation" Value="Horizontal" />
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
<!--In the app.xaml-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/>
<!--In the window/page scope-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/
Run Code Online (Sandbox Code Playgroud)
但我正在寻找更好的东西,而不是愚蠢地重新宣布所有的风格.
我在我的应用程序中实现了皮肤.应用程序加载其Brushes.xaml资源字典,该字典使用驻留在特定于皮肤的资源字典中的颜色.因此,根据所选皮肤,仅加载一个Color.xaml.
皮肤特异性Color.xaml
<Color x:Key="TextBoxBackgroundColor">#C4AF8D</Color>
<Color x:Key="TextBoxForegroundColor">#6B4E2C</Color>
<Color x:Key="ToolBarButtonForegroundColor">#6B4E2C</Color>
Run Code Online (Sandbox Code Playgroud)
Brushes.xaml:
<SolidColorBrush
x:Key="TextBoxBackground"
Color="{DynamicResource TextBoxBackgroundColor}" />
<SolidColorBrush
x:Key="TextBoxForeground"
Color="{DynamicResource TextBoxForegroundColor}" />
Run Code Online (Sandbox Code Playgroud)
如您所见,多种颜色(TextBoxForegroundColor和ToolBarButtonForegroundColor)是相同的.我想绕过它,因为它变得越来越混乱,特别是因为使用的颜色不能通过它们的十六进制值识别.您现在可以建议将两种颜色合并为一种,但我有一些皮肤,其中TextBoxForegroundColor与ToolBarButtonForegroundColor不同.
我想做的是这样的事情:
<Color x:Key="DarkBrown">#C4AF8D</Color>
<Color x:Key="TextBoxBackgroundColor" Color={StaticResource DarkBrown} />
<Color x:Key="ToolBarButtonForegroundColor" Color={StaticResource DarkBrown} />
Run Code Online (Sandbox Code Playgroud)
这在Xaml中是否可行?我找不到办法.
在WPF中是否有一种方法可以指定宽度/高度作为资源,以便可以在多种样式中重复使用,例如边距/填充?
我在ResourceDictionary中设置了一个SolidColorBrush和LinearGradientBrush资源.我使用这些,因为我重新设计了几个控件,用于我们的应用程序.
现在我有一堆其他外部画笔,我必须使用它们来改变我们的应用程序.这些也在ReseourceDictionary中设置.
是否可以将我的画笔资源指向另一个字典中的新资源,类似于样式的"BasedOn"属性?
这样的事情,概念上至少:
<SolidColorBrush x:Key="MyDataGridHeaderBrush" Binding="HeaderBrushDefinedElsewhere"/>
Run Code Online (Sandbox Code Playgroud)
...或者这种事情是不可能的,在这种情况下我只需要进行查找/替换并用新的刷子名称替换所有刷子名称?
提前致谢,
在
我有以下简化示例:
<Window x:Class="TemplateBinding.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>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="pack://application:,,,/TemplateBinding;component/PersonTemplate.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<ContentControl ContentTemplate="{StaticResource PersonTemplate}" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
附:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataTemplate x:Key="PersonTemplate">
<Border Width="100" Height="100" Background="RosyBrown">
<TextBlock Text="{Binding Path=FirstName}" VerticalAlignment="Center" TextAlignment="Center"/>
</Border>
</DataTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
作为我的DataTemplate在一个单独的ResourceDictionary文件中.
我在我的MainWindow的Construcor中设置了我的DataContext,并通过显示如下的第一个名称来验证它:<ContentControl Grid.Row="1" Content="{Binding FirstName}"/>.
在另一个场景中,我使用DataTemplate与我在DataTemplate中以ListBox完全相同的方式进行绑定,它只是起作用.
我知道DataTemplate除了绑定之外正在工作,因为它正确显示了大小和背景颜色.
我究竟做错了什么?我的DataTemplate中的绑定如何看?
data-binding wpf datatemplate resourcedictionary contentcontrol
我目前正在尝试实现Metro风格的窗口.
所以我在ResourceDictionary中创建了以下样式:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Brushes -->
<SolidColorBrush x:Key="BackgroundColor" Color="#FFFFFFFF" />
<!-- Buttons -->
<Style x:Key="MetroControlBoxButton" TargetType="Button">
<Setter Property="Background" Value="{StaticResource BackgroundColor}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- Windows -->
<Style x:Key="MetroWindow" TargetType="Window">
<Setter Property="UseLayoutRounding" Value="True" />
<Setter Property="WindowStyle" Value="None" />
<Setter Property="ResizeMode" Value="NoResize" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Window">
<Grid Background="{StaticResource BackgroundColor}">
<Grid.RowDefinitions>
<RowDefinition Height="6" />
<RowDefinition Height="24" />
<RowDefinition Height="*" />
<RowDefinition Height="24" />
<RowDefinition Height="6" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="6" …Run Code Online (Sandbox Code Playgroud) 我有一个简单的WPF窗口,上面有12个按钮.我希望将相同的样式应用于所有这些样式.此代码产生相同的错误:
<Window x:Class="TestApp.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="400" Width="500"
WindowStyle="None" WindowState="Maximized">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/AllResources.xaml"/>
<ResourceDictionary>
<Style TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="100"/>
</Style>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="1" Name="Button1"/>
<Button Grid.Column="1" Content="2" Name="Button2"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
第一个按钮没有应用它的样式,但第二个按钮没有.我可以设置一个键并在每个按钮上使用它,但我更愿意让WPF为我处理.我在写这篇文章时发现,当我不包含外部ResourceDictionary时,它按预期工作.这将是一个问题,因为我的应用程序扩展,因为我有多个需要共享相同资源的窗口.修改后的代码如下:
<Window x:Class="TestApp.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="400" Width="500"
WindowStyle="None" WindowState="Maximized">
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="100"/>
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="1" Name="Button1"/>
<Button Grid.Column="1" Content="2" Name="Button2"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
如果我(而不是删除合并的词典)添加x:Key ="key"属性,然后将该样式显式分配给每个按钮,它也可以工作. …
wpf ×10
styles ×5
xaml ×5
resources ×3
.net ×1
assemblies ×1
colors ×1
command ×1
data-binding ×1
datatemplate ×1
events ×1
skinning ×1
themes ×1