aierda 2023-10-18 17:25 采纳率: 72.1%
浏览 60
已结题

怎样在wpf的xaml中写一个乘法表达式

问题描述:

img


这是三个控制界面字体变化的按钮,小字体,正常字体,大字体。
据此,我是通过DynamicResource去实现的,故我创建了三个Resource文件,内容大致如下

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:system="clr-namespace:System;assembly=mscorlib">
    <system:Double x:Key="FontSizeScale">1.2</system:Double> //文字缩放比例,这个是放大的Resource,其它两个文件的值分别为1和 0.8
</ResourceDictionary>

xaml界面原本是这样写的

<TextBlock  FontSize="30"></TextBlock>

加入动态资源后,按理应该是这样的

 <TextBlock  FontSize="30 * {DynamicResource FontSizeScale}"></TextBlock> //在原文字大小的基础上进行Scale

但是FontSize="30 * {DynamicResource FontSizeScale}"这样的写法是通不过的,认为写法不对。

提出问题:
那么这个表达式要怎样写才有效呢,难道还要封装成一个转换器什么的?
期待大家能够给点意见或解决方案,感谢!

  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-10-18 17:26
    关注
    获得1.50元问题酬金

    引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。


    在WPF的XAML中,你可以使用MultiBinding和自定义的ValueConverter来实现乘法表达式。

    首先,创建一个名为MultiplyConverter的自定义ValueConverter,用于将两个值相乘:

    using System;
    using System.Globalization;
    using System.Windows.Data;
    
    namespace YourNamespace
    {
        public class MultiplyConverter : IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
                if (values.Length == 2 && values[0] is double && values[1] is double)
                {
                    double value1 = (double)values[0];
                    double value2 = (double)values[1];
    
                    return value1 * value2;
                }
    
                return null;
            }
    
            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            {
                throw new NotSupportedException();
            }
        }
    }
    

    然后,在你的XAML中,添加一个MultiBindingTextBlock的父元素:

    <Grid>
        <Grid.Resources>
            <converters:MultiplyConverter x:Key="MultiplyConverter" /> <!-- 这里的"converters"是你的converters命名空间 -->
        </Grid.Resources>
    
        <TextBlock>
            <TextBlock.FontSize>
                <MultiBinding Converter="{StaticResource MultiplyConverter}">
                    <Binding Source="30" /> <!-- 第一个操作数 -->
                    <Binding Source="{DynamicResource FontSizeScale}" /> <!-- 第二个操作数 -->
                </MultiBinding>
            </TextBlock.FontSize>
        </TextBlock>
    </Grid>
    

    在这个示例中,我们创建了一个MultiplyConverter的实例作为静态资源。然后,我们使用MultiBinding将两个值传递给这个转换器进行乘法运算。第一个值是常数30,第二个值是FontSizeScale的动态资源。

    注意,我们还需要在TextBlock的父元素中添加一个Grid.Resources元素,将自定义转换器作为静态资源。

    希望这可以帮助到你!

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 创建了问题 10月18日