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

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 请教一下simulink中S函数相关问题
    • ¥15 Hadoop中eclipse运行问题
    • ¥15 在二层网络中,掩码存在包含关系即可通信
    • ¥15 端口转发器解析失败不知道电脑设置了啥
    • ¥15 Latex算法流程图行号自定义
    • ¥15 关于#python#的问题:我在自己的电脑上运行起来总是报错,希望能给我一个详细的教程,(开发工具-github)
    • ¥40 基于51单片机实现球赛计分器功能
    • ¥15 cs2游戏画面卡住,应用程序sid与指挥者sid不匹配
    • ¥15 实验七:Pandas要有实验截图和代码
    • ¥15 TypeError: Make sure that the iterable only contains strings.