cenxaoi 2022-11-10 12:23
浏览 10
已结题

Grid.Width绑定Window.Width不能正确跟踪

问题遇到的现象和发生背景

要求:Grid.ColumnDefinition.Width需要随着窗口大小变化而变化,需求是Grid.ColumnDefinition.Width=Window.Width*0.382。
下面代码col0是Grid第一列的Name

col0.SetBinding(ColumnDefinition.WidthProperty, new Binding("Width"){ Source = this,ConverterParameter= "({0}*0.382)",Converter=new DTEvalConvert() });

DTEvalConvert是利用DataTable来实现表达式的转换器

    /// 
    /// 使用DataTalbe.Compute
    /// 
    public class DTEvalConvert : IValueConverter
    {
        static System.Data.DataTable dt = new System.Data.DataTable();
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(parameter != null)
            {
                string expression = parameter.ToString().Replace("{0}",value.ToString());
                var r = dt.Compute(expression, "");
                return r;
            }
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }
运行结果及报错内容

当窗体改变大小时,发现Col0.Width没跟着改变,其值一固定。

通过断点 var r = dt.Compute(expression, ""); 发现启动运行,窗体实例建立后,DTEvalConvert .Convert 会执行一次,object value的值是A
当点击窗体最大化后,DTEvalConvert .Convert 会执行2次,第一次参数object value的值是当前窗体正确的新宽度B,
第二次传入object value 窗体旧宽度B.
因为有第二次传入,导致Col0.Width无法达到预期值。目前不知绑定为啥会执行2次。
在给winndow.SizeChanged实现事件函数,在Window_SizeChanged设置断点调试,发现点击窗体最大化后,先执行2次DTEvalConvert .Convert,再执行在Window_SizeChanged。这样更改col0宽度可以写在SizedChanged里面,那么col0的绑定变得毫无意义。
请问如果不在Window_SizeChanged写实现,如何解决DTEvalConvert .Convert 会执行2次并在第二次传入旧值的原因。

  • 写回答

1条回答 默认 最新

  • cenxaoi 2022-11-10 12:35
    关注

    搜索到答案。。。。 wpf的window 还有个ActualWidth 和ActualHeight两个属性。改为绑定这两个属性,转换器只工作一次。能得到预期效果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 11月10日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 如何将下列的“无限压缩存储器”设计出来
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口