1
다른 동적 리소스의 동적 리소스에 값을 할당 할 수 있습니까? 예다른 동적 리소스를 기반으로 동적 리소스의 값을 정의하는 방법은 무엇입니까?
<sys:Double x:Key="ButtonWidth">48</sys:Double>
<sys:Double x:Key="SmallButtonWidth"> ButtonWidth/2 </sys:Double>
다른 동적 리소스의 동적 리소스에 값을 할당 할 수 있습니까? 예다른 동적 리소스를 기반으로 동적 리소스의 값을 정의하는 방법은 무엇입니까?
<sys:Double x:Key="ButtonWidth">48</sys:Double>
<sys:Double x:Key="SmallButtonWidth"> ButtonWidth/2 </sys:Double>
것이 가능 옵션
커스텀 MarkupExtension
을 사용하여 값을 변환한다.
이와
namespace WpfApplication1.MathShit
{
[ContentProperty("Expression")]
public class Calculation : MarkupExtension
{
public IExpression Expression { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (Expression == null) throw new Exception("Expression cannot be null.");
return Expression.CalculateValue();
}
}
[TypeConverter(typeof(ExpressionConverter))]
public interface IExpression
{
double CalculateValue();
}
public abstract class BinaryOperation : IExpression
{
public IExpression Operand1 { get; set; }
public IExpression Operand2 { get; set; }
public double CalculateValue()
{
if (Operand1 == null) throw new Exception("Operand1 cannot be null.");
if (Operand2 == null) throw new Exception("Operand2 cannot be null.");
return CalculateBinaryOperation();
}
protected abstract double CalculateBinaryOperation();
}
public class Sum : BinaryOperation
{
protected override double CalculateBinaryOperation()
{
return Operand1.CalculateValue() + Operand2.CalculateValue();
}
}
public class Product : BinaryOperation
{
protected override double CalculateBinaryOperation()
{
return Operand1.CalculateValue() * Operand2.CalculateValue();
}
}
public class Value : MarkupExtension, IExpression
{
public double? Double { get; set; }
public Value() { }
public Value(double @double)
: this()
{
this.Double = @double;
}
public double CalculateValue()
{
if (Double == null) throw new Exception("Double");
return Double.Value;
}
// Allows easy object instantiation in XAML attributes. (Result of StaticResource is not piped through ExpressionConverter.)
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
public class ExpressionConverter : DoubleConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
var doubleValue = (double)base.ConvertFrom(context, culture, value);
return (IExpression)new Value(doubleValue);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
var val = (Value)value;
return base.ConvertTo(context, culture, val.CalculateValue(), destinationType);
}
}
}
<Window.Resources xmlns:ms="clr-namespace:WpfApplication1.MathShit">
<sys:Double x:Key="ButtonWidth">48</sys:Double>
<ms:Calculation x:Key="SmallButtonWidth">
<ms:Product Operand1="{ms:Value {StaticResource ButtonWidth}}"
Operand2="0.5" />
</ms:Calculation>
</Window.Resources>
당신이 (당신이 문제가 괜찮다면 당신은뿐만 아니라 당연히 할 수있는 수학 문자열을 구문 분석하는 것보다 훨씬 더 쉽게하는) 임의의 식 트리를 구축 할 수 있습니다.