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 scrapy爬虫求帮
  • ¥15 imageEnView绘图问题
  • ¥15 关于#python#的问题:您好可以加您一下联系方式吗,在复现的时候确实有点问题难以解决
  • ¥15 联想电脑重装系统时无法发现硬盘
  • ¥15 MATLAB与UR10e实体机械臂建立通讯
  • ¥15 c++题需要快一点不用opencv
  • ¥15 关于#java#的问题:想要咨询Flowable流程引擎框架的问题
  • ¥15 vscode里面怎么用plaformio强调串口啊
  • ¥20 针对计算后数据做一致性检验可以用Bland Altman法吗
  • ¥15 win32如何自绘编辑框的背景图片(语言-c++|操作系统-windows)