0

XAML で定義された 2 つの定数があり、その 2 つに基づいて 3 番目を定義したいと思います。

<UserControl ... xmlns:clr="clr-namespace:System;assembly=mscorlib">
    <UserControl.Resources>
        <clr:Int32 x:Key="Constant1">1</clr:Int32>
        <clr:Int32 x:Key="Constant2">2</clr:Int32>

        <!-- Is it possible to achieve something like this? -->
        <clr:Int32 x:Key="Constant3">{StaticResource Constant1} + {StaticResource Constant2}</clr:Int32>
    </UserControl.Resources>
</UserControl>

出来ますか?

4

1 に答える 1

1

可能ですが、やりたいようにはできません。私が考えることができる 1 つの解決策は、次のようなカスタム MarkupExtension です。

[MarkupExtensionReturnType(typeof(int))]
public class IntCalculator:MarkupExtension
{
    public List<int> Values { get; set; }

    public List<string> ResourceNames { get; set; } 

    public IntCalculator()
    {
        Values = new List<int>();
        ResourceNames = new List<string>();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var root = (IRootObjectProvider)serviceProvider.GetService(typeof(IRootObjectProvider));
        var rootObject = root.RootObject as FrameworkElement;
        int calcVal = 0;
        if (rootObject != null)
        {
            foreach (var resourceName in ResourceNames)
            {
                var resource = rootObject.FindResource(resourceName);
                if (resource != null && resource is int)
                {
                    calcVal += System.Convert.ToInt32(resource);
                }
            }
        }


        foreach (var value in Values)
        {
            calcVal += value;
        }
        return calcVal;
    }
}

この拡張機能を使用すると、int リソースまたは int 値を追加できます。これはそれを使用する方法です:

  • あなたのリソースで:

    <local:IntCalculator x:Key="CalcVal">
        <local:IntCalculator.ResourceNames>
            <clr:String>Constant1</clr:String>
            <clr:String>Constant2</clr:String>
        </local:IntCalculator.ResourceNames>
    </local:IntCalculator>
    
  • 値を表示するには:

    <Label Content="{StaticResource CalcVal}"/>
    
于 2013-09-12T11:39:41.807 に答える