我们都知道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