سؤال

لدي قائمة قيم تحتوي على ResourceKey وتعليق، وهذه القيم عبارة عن سلسلتين.المورد هو اسم المورد الفعلي المحدد في قاموس الموارد.كل من أيقونات ResourceKey هذه هي أيقونات Canvas.

<Data ResourceKey="IconCalendar" Caption="Calendar"/>
<Data ResourceKey="IconEmail" Caption="Email"/>

لدي بعد ذلك عرض قائمة يحتوي على قالب بيانات به زر وتعليق نصي أسفل الزر.ما أريد القيام به هو عرض المورد الثابت كمحتوى للزر.

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <Button Content="{Binding ResourceKey}" Template="{StaticResource  RoundButtonControlTemplate}"/>
            <TextBlock Grid.Row="1" Margin="0,10,0,0" Text="{Binding Caption}" HorizontalAlignment="Center" FontSize="20" FontWeight="Bold" />
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

أعتقد أنني جربت كل التقليب باستخدام مصدر ثابت ملزم وما إلى ذلك.

أنا منفتح على البدائل، وأعلم أنه قد يكون من الأسهل الحصول على صورة وتعيين خاصية المصدر.

شكرًا

هل كانت مفيدة؟

المحلول

وبعد وجود التفكير قليلا I تنتهي باستخدام ValueConvertor مثل ذلك:

class StaticResourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var resourceKey = (string)value;

        return Application.Current.Resources[resourceKey];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

ووالربط على زر يصبح

<Button Content="{Binding ResourceKey, Converter={StaticResource resourceConverter}}" />

نصائح أخرى

لقد حصلت هنا على نسخة محسنة من إجابة @dvkwong (جنبًا إلى جنب مع تعديل @Anatoliy نيكولاييف):

class StaticResourceConverter : MarkupExtension, IValueConverter
{
    private Control _target;


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var resourceKey = (string)value;

        return _target?.FindResource(resourceKey) ?? Application.Current.FindResource(resourceKey);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var rootObjectProvider = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
        if (rootObjectProvider == null)
            return this;

        _target = rootObjectProvider.RootObject as Control;
        return this;
    }
}

الاستخدام:

<Button Content="{Binding ResourceKey, Converter={design:StaticResourceConverter}}" />

التغيير الأساسي هنا هو:

  1. المحول الآن هو System.Windows.Markup.MarkupExtension لذلك يمكن استخدامه مباشرة دون الإعلان عنه كمورد.

  2. المحول مدرك للسياق، لذلك لن يبحث فقط في موارد تطبيقك، ولكن أيضًا في الموارد المحلية (النافذة الحالية أو عنصر تحكم المستخدم أو الصفحة وما إلى ذلك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top