public class ViewModelFactory
{
private static Dictionary<string, object> vmMap = new Dictionary<string, object>();<br>
public static T GetViewModel<T>() where T : ViewModelBase
{
Type vmType = typeof(T);
if (vmMap.ContainsKey(vmType.FullName))
{
return (T)vmMap[vmType.FullName];
}
else
{
object vm = Activator.CreateInstance(vmType);
vmMap.Add(vmType.FullName, vm);
return (T)vm;
}
}
public static T GetViewModel<T>(object[] data,string id) where T : ViewModelBase
{
Type vmType = typeof(T);
if (vmMap.ContainsKey(id))
{
return (T)vmMap[id];
}
else
{
object vm = Activator.CreateInstance(vmType, data);
vmMap.Add(id, vm);
return (T)vm;
}
}
}
public delegate void CloseEventHandle(object sender);
public class CustomViewModel : ViewModelBase
{
public event CloseEventHandle CloseEvent;
protected bool hasData;
public CustomViewModel()
{
LoadCommand = new RelayCommand(() =>
{
if (!hasData)
{
ThreadPool.QueueUserWorkItem((obj) =>
{
lock (this)
{
OnLoad();
hasData = true;
}
});
}
});
}public RelayCommand LoadCommand { private set; get; }
protected virtual void OnLoad()
{
}
protected void OnClose(object sender)
{
if (sender != null && CloseEvent != null)
{
CloseEvent(sender);
}
}
}
public class ShowHelper
{
private static Dictionary<string, Window> windowManager = new Dictionary<string, Window>();
public static void ShowDiaglogUc<T>(string title, object[] constructors = null, bool isDialog = false) where T : UserControl
{
Type controlType = typeof(T);
string key;
if (constructors == null) //如果构造参数为null
{
key = controlType.FullName; //key = T 的完全限定名
}
else
{
// 如果不为空 并且 第二个构造参数为string(第二个参数代表id -->有可能是GroupId 有可能是UserId);
if (constructors.Length == 2 && constructors[1] is string) //ps:这里本人写死了可以根据需求自行修改
{
key = controlType.FullName + constructors[1].ToString(); //key = 控件 完全限定名+id;
}
else //不满足条件
{
key = controlType.FullName; //key = 限定名
}
}
if (windowManager.ContainsKey(key)) //如果包含KEY
{
windowManager[key].Topmost = true; //设置TopMost
return;
}
UserControl content;
if (constructors == null)
{
content = Activator.CreateInstance(controlType) as UserControl;
}
else
{
content = Activator.CreateInstance(controlType, constructors) as UserControl;
}
BaseWindow window = new BaseWindow(); //PS这是自己封装 的Window,(可以用直接用原始的Wpf Widnow)
window.Title = title;
windowManager.Add(key, window);
window.Closed += (sen, cloE) =>
{
windowManager.Remove(key);
};
if (isDialog)
{
window.ShowDialog();
}
else
{
window.Show();
}
#region 注册关闭事件
if (content.DataContext as CustomViewModel != null)
{
CustomViewModel vm = content.DataContext as CustomViewModel;
vm.CloseEvent += (obj) =>
{
if (content.DataContext.Equals(obj))
{
window.Close();
}
};
}
#endregion
}
public static CustomDialogResult ShowOkCancleUC<T>(string title, MsgBoxBtn okCancle, out object data) where T : Control
{
Type vmType = typeof(T);
Control content = Activator.CreateInstance(vmType) as Control;
OkCanleWindow window = new OkCanleWindow();
window.ShowInTaskbar = false;
return window.ShowDialog(title, okCancle, content, out data);
}
public static CustomDialogResult MessageBoxDialog(string title, string message, MsgBoxBtn okCancle)
{
OkCanleWindow window = new OkCanleWindow();
window.ShowInTaskbar = false;
object none;
return window.ShowDialog(title, okCancle, new MessageUC() { Message = message }, out none);
}
、(1)开始剖析 public static void ShowDiaglogUc<T>(string title, object[] constructors = null, bool isDialog = false) where T : UserControl
ShowDialogUc 是用来在VM中用来创建UserControl并显示在Window中的。你可能会问为啥用windowManager 将窗口缓存起来(PS这里主要还是为了解决单例窗口的麻烦),
至于 下面这段代码,我们可以回到创建的CustomerViewModel中,对这里需要注册VM中CloseEvent事件,这样我们在VM中就可以直接调用OnClose()方法就OK了
#region 注册关闭事件
if (content.DataContext as CustomViewModel != null)
{
CustomViewModel vm = content.DataContext as CustomViewModel;
vm.CloseEvent += (obj) =>
{
if (content.DataContext.Equals(obj))
{
window.Close();
}
};
}
#region 注册关闭事件
<controls:BaseWindow x:Class="Common.OkCanleWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:controls="clr-namespace:Controls;assembly=Controls"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MessageBoxWindow">
<Grid x:Name="grid">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Content="确 定" x:Name="okBtn" Click="okBtn_Click" Grid.Row="1" Height="30" Width="120" HorizontalAlignment="Right" Margin="0 0 10 0"/>
<Button Content="取 消" x:Name="canleBtn" Click="canleBtn_Click" Grid.Row="1" Grid.Column="1" Height="30" Width="120" HorizontalAlignment="Left" Margin="10 0 0 0"/>
</Grid>
</controls:BaseWindow>
后台代码:
public partial class OkCanleWindow : BaseWindow
{
public OkCanleWindow()
{
InitializeComponent();
this.Closed += (s, e) =>
{
if (result == CustomDialogResult.None)
{
result = CustomDialogResult.Cancel;
}
};
}
private System.Windows.Controls.Control control;
CustomDialogResult result;
public CustomDialogResult ShowDialog(string title, MsgBoxBtn btnState, Control uc, out object dataContext)
{
#region 设置控件
if (btnState == MsgBoxBtn.Ok) //如果为OK状态
{
Grid.SetColumnSpan(okBtn, 2); //设置OK按钮跨两列
okBtn.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; //设置OK按钮居中对齐
canleBtn.Visibility = System.Windows.Visibility.Collapsed; //设置Cancel 按钮隐藏;
if (uc != null)
{
control = uc;
Grid.SetRow(uc, 0); //设置控件所在Grid 的行
Grid.SetColumnSpan(uc, 2); //设置控件所在Grid 的列
this.Width = uc.Width; //设置窗体宽度
this.Height = uc.Height + grid.RowDefinitions[1].Height.Value + 35; //设置窗体宽度 高度
grid.Children.Add(uc); //加入控件
}
}
if (btnState == MsgBoxBtn.None) //如果为None 既没有OK 也没有 Cancle
{
grid.RowDefinitions.RemoveAt(1);
okBtn.Visibility = System.Windows.Visibility.Collapsed;
canleBtn.Visibility = System.Windows.Visibility.Hidden;
if(uc !=null)
{
control = uc;
Grid.SetRow(uc, 0); //设置控件所在Grid 的行
Grid.SetColumnSpan(uc, 2); //设置控件所在Grid 的列
this.Width = uc.Width; //设置窗体宽度
this.Height = uc.Height + 35;
grid.Children.Add(uc); //加入控件
}
}
this.Title = title;
dataContext = uc.DataContext;
#endregion
this.ShowDialog();return result;
}
private void okBtn_Click(object sender, RoutedEventArgs e)
{
result = CustomDialogResult.OK;
this.Close();
}
private void canleBtn_Click(object sender, RoutedEventArgs e)
{
result = CustomDialogResult.Cancel;
this.Close();
}
}
public enum CustomDialogResult
{
None,OK,Cancel
}
public enum MsgBoxBtn
{
None,Ok,OkCancel
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有