作为变量的Xaml ResourceKey不起作用

本文关键字:ResourceKey 不起作用 Xaml 变量 | 更新日期: 2023-09-27 18:12:48

我正在使用一个组合框(WPF 4.0)来显示编辑器应用程序的用户定义的段落样式。这个组合框有两列:

(1)段落样式名称

(2)文本"abcABC123",在某些属性中应该根据第一列的段落样式进行格式化

(1)正在工作,(2)不是因为_ResourceKey_background, _ResourceKey_foreground和_ResourceKey_fontFamily没有ResourceKeys而是包含ResourceKeys的变量。我怎么解决这个问题?

_NameInternal, _NameUI, _ResourceKey_background, _ResourceKey_foreground和_ResourceKey_fontFamily是公共属性用户定义的段落样式类的。

<ComboBox Name="_cbStylesPara" SelectedValuePath="_NameInternal"
          ItemsSource="{Binding Source={StaticResource _collectionViewSource_stylesPara}}" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition />
                </Grid.RowDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding _NameUI}" VerticalAlignment="Center" />
                <TextBlock Grid.Column="1" Text="abcABC123" Margin="3,0,0,0" VerticalAlignment="Center"
                           Background="{DynamicResource _ResourceKey_background}"
                           Foreground="{DynamicResource _ResourceKey_foreground}"
                           FontFamily="{DynamicResource _ResourceKey_fontFamily}" />
            </Grid>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

作为变量的Xaml ResourceKey不起作用

就像你说的资源是在App资源下声明的,你能做的就是创建一个IValueConverter并从它的Convert方法返回资源值。

public class ResouceLookupConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        return App.Current.TryFindResource(value);
    }
    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

XAML :

<ComboBox>
  <ComboBox.Resources>
     <local:ResouceLookupConverter x:Key="ResouceLookupConverter"/>
  </ComboBox.Resources>
  ......
  <TextBlock Grid.Column="1" Text="abcABC123" Margin="3,0,0,0"
             VerticalAlignment="Center"
             Background="{Binding _ResourceKey_background,
                          Converter={StaticResource ResouceLookupConverter}}"
             Foreground="{Binding _ResourceKey_foreground,
                          Converter={StaticResource ResouceLookupConverter}}"
             FontFamily="{Binding _ResourceKey_fontFamily,
                          Converter={StaticResource ResouceLookupConverter}}" />
</ComboBox>

注意:当然,您必须在XAML设置中定义本地命名空间为声明Converter的命名空间