WPF利用转换器做界面切换

我们都知道WPF中控件有visibility属性和Tag属性,包括visible,collasped,hidden,我做的界面切换的思路就是隐藏所有的控件,显示需要的,我们利用控件上的Tag属性标识1或0,首先全部置0,需要显示那个就置1

假如我们用0代表collasped,1表示visible,那么转换器converter便可以这样写

    public class TagVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int tag = int.Parse(value.ToString());
            var param = parameter as string;
            if (!string.IsNullOrEmpty(param))
                int.TryParse(param, out tag);
            if (value == null)
                return Visibility.Collapsed;
            return (tag != 1) ? Visibility.Collapsed : Visibility.Visible;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

xaml上就可以这样写 tag="0" Visibilyty ="{binding elementname=controlname,path=Tag,converter{staticresource TagVisibilityConverter }}"

界面显示与隐藏的方法如下

        /// <summary>
        /// 显示界面
        /// </summary>
        /// <param name="sender"></param>
        public static void ControlTagVisible(object sender)
        {
            if (sender.GetType() == typeof(Grid))
            {
                var control = sender as Grid;
                control.Tag = 1;
            }
            else if (sender.GetType() == typeof(StackPanel))
            {
                var control = sender as StackPanel;
                control.Tag = 1;
            }
            else { }          
        }

        /// <summary>
        /// 隐藏界面
        /// </summary>
        /// <param name="targetNames"></param>
        public static void ControlTagCollasped(object[] targetNames)
        {
            for (int i = 0; i < targetNames.Length; i++)
            {
                if (targetNames[i].GetType() == typeof(Grid))
                {
                    var control = targetNames[i] as Grid;
                    control.Tag = 0;
                }
                else if (targetNames[i].GetType() == typeof(StackPanel))
                {
                    var control = targetNames[i] as StackPanel;
                    control.Tag = 0;
                }
                else { }
            }
        }

调用的时候先实例化控件数组targetNames,隐藏的时候调用ControlTagCollasped,显示的时候直接调用ControlTagVisible

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值