- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是迄今为止我在从事 WPF 工作的一年中遇到的最令人困惑的问题。该问题有两个组成部分,对于使用 WPF 时间较长的人来说可能更能说明问题:
UserControl
中,我的 ResourceDictionary
元素提示它需要一个 Key
属性。 Key
属性并尝试在设计时从 XAML 访问样式时,Intellisense(和编译器)不知道我导入的 ResourceDictionary
中定义的样式>.MenuItem
上的 .ItemTemplate
这是我的资源的 UserControl
XAML 声明,请注意 x:Key
属性。
<UserControl.Resources>
<ResourceDictionary x:Key="HeaderViewStyles">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Styles/Controls/HeaderViewStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
这里是 ResourceDictionary
的部分实现,定义了我希望在 MenuItem
上使用的样式。
x:Class="Styles.Controls.HeaderViewStyles">
<Style x:Key="DarkMenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="Foreground" Value="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Menu}}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<!---
可能是上面的样式本身有问题;但是,我感兴趣的是为什么我无法在设计时访问样式。
这是我应用样式的尝试(发布以获取完整信息):
<Menu>
<MenuItem ItemsSource="{Binding ContextMenuItemViewModels}">
<MenuItem.Icon>
<Image Source="../../Resources/menu.png"/>
</MenuItem.Icon>
<MenuItem.ItemTemplate>
<DataTemplate DataType="{x:Type controlViewModels:ContextMenuItemViewModel}">
<MenuItem Style="{DynamicResource DarkMenuItem}"
Header="{Binding MenuHeaderText}"
Command="{Binding MenuItemClickedCommand}"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</Menu>
我确信这是多种因素的结合;但是,我显然缺乏一些知识。我错过了什么或没有做什么?我尝试了各种组合,但仍然无法选择风格。
编辑
对于那些想要了解更多信息的人,这是我的控件 XAML:
<UserControl x:Class="Views.Controls.HeaderView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controlViewModels="clr-namespace:ViewModels.Controls"
xmlns:controlViews="clr-namespace:Views.Controls"
xmlns:converters="clr-namespace:Converters"
VerticalContentAlignment="Stretch"
Background="#4C4C4C">
<UserControl.Resources>
<converters:SyncStateToVisibilityConverter x:Key="SyncStateToVisibilityConverter"/>
<ResourceDictionary x:Key="HeaderViewStyles">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Styles/Controls/HeaderViewStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="6"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="110"/>
</Grid.ColumnDefinitions>
<Button Background="#4C4C4C" Margin="20,0,0,0"
VerticalAlignment="Center"
Command="{Binding StatusButtonClickedCommand}">
<Image >
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Source" Value="{Binding StatusIconLocation}"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Source" Value="{Binding StatusIconLocationHover}"/>
</Trigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Button>
<StackPanel Grid.Column="1" Grid.ColumnSpan="2" Orientation="Vertical">
<TextBlock></TextBlock>
<TextBlock></TextBlock>
</StackPanel>
<Menu>
<MenuItem ItemsSource="{Binding ContextMenuItemViewModels}">
<MenuItem.Icon>
<Image Source="../../Resources/menu.png"/>
</MenuItem.Icon>
<MenuItem.ItemTemplate>
<DataTemplate DataType="{x:Type controlViewModels:ContextMenuItemViewModel}">
<MenuItem Style="{DynamicResource DarkMenuItem}"
Header="{Binding MenuHeaderText}"
Command="{Binding MenuItemClickedCommand}"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</Menu>
<ProgressBar Grid.Row="1"
Grid.ColumnSpan="3"
Value="{Binding PercentageSynced}"
Visibility="{Binding CurrentSyncSystemStatus,
Converter={StaticResource SyncStateToVisibilityConverter},
ConverterParameter=Syncing,
FallbackValue=Collapsed}"/>
</Grid>
最佳答案
您需要将您的转换器移动到资源字典中,并删除 x:Key,如下所示:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Styles/Controls/HeaderViewStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<converters:SyncStateToVisibilityConverter x:Key="SyncStateToVisibilityConverter"/>
</ResourceDictionary>
</UserControl.Resources>
如果您将没有键的 ResourceDictionary 作为 UserControl.Resources
的根 - 这意味着:
userControl.Resources = new ResourceDictionary();
因此,您必须将所有其他资源都放在内部该字典中,而不是外部。
您原来的 xaml(带有 x:Key)大致是这样的:
userControl.Resources.Add("SyncStateToVisibilityConverter", new YourConverter());
userControl.Resources.Add("HeaderViewStyles", new ResourceDictionary(...));
所以,并不是您所期望的那样。
关于c# - 无法解析样式、ResourceDictionary、UserControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43680626/
我已经在我的共享项目中毫无问题地创建了一个 ResourceDictionary。但是,我的某些样式会非常特别* Windows Phone 8.1 而不会在 Windows 8.1 中使用。由于 W
我有一些这样的代码 _images = new ResourceDictionary { Source = new Uri(@"pack://a
我的 App.xaml 中有以下代码集:
是否可以将一个资源字典添加到另一个资源字典中? 最佳答案 在 Dictionary2.xaml 中定义 MergedDictionaries(紧跟在打开的 ResourceDictionary 标记之
我有两个程序集,每个程序集都提供一组通用的样式和资源,我想将它们包含在我的应用程序中。我在 App.xaml 中使用合并字典为了加载它们,在运行时它们很好。不幸的是,这些资源不会在设计时加载,用有关无
我有资源字典文件(MenuTemplate.xaml、ButtonTemplate.xaml 等),我想在多个单独的应用程序中使用它们。我可以将它们添加到应用程序的程序集中,但如果我将这些资源编译在一
在我的WPF应用程序内部,我包括另一个项目的ResourceDictionary。
ONE TWO THREE 现在想使用 C# 在 WPF 中通过 code-behind 动态创建与上面相同的资源 ResourceDictionary。是否可以这样创建?
我有一个类库项目,它对其他几个项目是通用的。它的程序集名称是“MyCompany”,它的默认命名空间也是“”。 然后在这些其他项目之一(命名空间“MyCompany.Something”)中,我引用了
我需要动态更改 App.xaml 文件中的 ResourceDictionary。我尝试了以下代码: ResourceDictionary newRes = new ResourceDictionar
请提前见谅。第一个问题。 我正在开发一个 WPF 项目,在该项目中我在应用程序级别定义了一个简单的资源字典。 对 ResourceDictionary 的引用工作正常;我
我有以下 ResourceDictionary(缩写): 当我访问字典的 Keys 属性时,键的顺序如下: dokumentRibbonTabaustauschRibbon
我有一个名为 MyButton.xaml 的 ResourceDictionary,其中定义了 x:Type ButtonBase 的样式。 我知道如何使用此 ResourceDictionary 以
在下面的触发器中,只有前景 setter 在工作。我不明白为什么。 感谢您的帮助。 最佳答案 这不起作用的原因是因为默认的 Button 模板使用 Bu
我有这个应用程序结构: AppName Resources Languages en.xaml it.xaml 我正在尝试根据我
假设我的 Application.xaml 中有一些 ResourceDictionary 定义如下:
我在文件系统的某处有一个程序集,例如“C:\temp\test.dll”。在该程序集中有一个 ResourceDictionary,例如“abc.xaml”。 我怎样才能得到 ResourceDict
我的项目中有一个文件夹,Templates,里面装满了(已编译的)XAML ResourceDictionaries。 在 UserControl 中,我想将所有模板加载到 ResourceDicti
如何在用户控制库中定义 ResourceDictionary 并通过 Xaml 代码访问它们。 我创建了这样的东西:
假设我有对象: 我通常通过类似的方式引用它: 虽然这有效,但如果我第二次调用它,它会删除第一次使用并将其移至请求的第二次使用。 很明显,我调用资源的方法存在问题。如果我想要对象的唯一实例
我是一名优秀的程序员,十分优秀!