通过绑定访问ResourceDictionary中的条目

时间:2014-05-06 18:42:43

标签: c# wpf xaml mahapps.metro

我试图像Windows手机那样创建一个类似的重音色选系统,其中所有可用的颜色都以正方形网格显示。

Mahapps.Metro有一个名为Accent的对象,它有一个名称(字符串)和一个附加到它的资源字典。所以在我的列表框中,我试图绑定到这些项目。

这是我的XAML的样子

<ListBox x:Name="accentChooserBox" ItemsSource="{Binding}" PreviewMouseDoubleClick="accentChooserBox_PreviewMouseDoubleClick" SelectionMode="Single">
                            <ListBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel IsItemsHost="True"/>
                                </ItemsPanelTemplate>
                            </ListBox.ItemsPanel>
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid Background="{Binding Path=???}" Height="50" Width="50">
                                        <TextBlock Text="{Binding Path=Name}" FontWeight="Light" VerticalAlignment="Bottom"/>
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>

我想将Grid的背景设置为Accent的AccentColor。 这里也是Resourcedictionary如何看起来像

的一个例子
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="HighlightColor">#FF5133AB</Color>

<Color x:Key="AccentColor">#CC6459DF</Color> <--- I want to bind to this
<!--60%-->
<Color x:Key="AccentColor2">#996459DF</Color>
<!--40%-->
<Color x:Key="AccentColor3">#666459DF</Color>
<!--20%-->
<Color x:Key="AccentColor4">#336459DF</Color>

<!-- re-set brushes too -->
<SolidColorBrush x:Key="HighlightBrush" Color="{StaticResource HighlightColor}" />
<SolidColorBrush x:Key="AccentColorBrush" Color="{StaticResource AccentColor}"/>
<SolidColorBrush x:Key="AccentColorBrush2" Color="{StaticResource AccentColor2}"/>
<SolidColorBrush x:Key="AccentColorBrush3" Color="{StaticResource AccentColor3}"/>
<SolidColorBrush x:Key="AccentColorBrush4" Color="{StaticResource AccentColor4}"/>

<SolidColorBrush x:Key="WindowTitleColorBrush" Color="{StaticResource AccentColor}" />

<SolidColorBrush x:Key="AccentSelectedColorBrush" Color="White" />

<LinearGradientBrush x:Key="ProgressBrush" EndPoint="0.001,0.5" StartPoint="1.002,0.5">
    <GradientStop Color="{StaticResource HighlightColor}" Offset="0" />
    <GradientStop Color="{StaticResource AccentColor3}" Offset="1" />
</LinearGradientBrush>

<SolidColorBrush x:Key="CheckmarkFill" Color="{StaticResource AccentColor}" />
<SolidColorBrush x:Key="RightArrowFill" Color="{StaticResource AccentColor}" />

<Color x:Key="IdealForegroundColor">White</Color>
<SolidColorBrush x:Key="IdealForegroundColorBrush" Color="{StaticResource IdealForegroundColor}"/>

我如何在Grid的背景属性中写这个?我尝试使用Background="{Binding Path=Resources.AccentColor}",但这不起作用。

1 个答案:

答案 0 :(得分:1)

如果您将资源字典合并到资源中,则可以直接访问它:

<ListBox ...>
  <ListBox.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Path/To/YourResourceDictionary.xaml"/>
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </ListBox.Resources>

然后,只需使用它:

  <ListBox.ItemTemplate>      
    <DataTemplate>
      <Grid Background="{Binding Path=AccentColor}" Height="50" Width="50">