1.自定义控件 MiniView
xaml:
<UserControl x:Class="OwnCommandDemo.MiniView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:OwnCommandDemo"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Border CornerRadius="5" BorderBrush="LawnGreen" BorderThickness="2">
<StackPanel>
<TextBox x:Name="textBox1" Margin="5"/>
<TextBox x:Name="textBox2" Margin="5,0"/>
<TextBox x:Name="textBox3" Margin="5"/>
<TextBox x:Name="textBox4" Margin="5,0"/>
</StackPanel>
</Border>
</UserControl>
cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace OwnCommandDemo
{
/// <summary>
/// MiniView.xaml 的交互逻辑
/// </summary>
public partial class MiniView : UserControl,IView
{
public MiniView()
{
InitializeComponent();
}
public bool IsChanged { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public void Clear()
{
this.textBox1.Clear();
this.textBox2.Clear();
this.textBox3.Clear();
this.textBox4.Clear();
}
public void Refresh()
{
throw new NotImplementedException();
}
public void Save()
{
throw new NotImplementedException();
}
public void SetBinding()
{
throw new NotImplementedException();
}
}
}
2.IView接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OwnCommandDemo
{
public interface IView
{
// 属性
bool IsChanged { get; set; }
// 方法
void SetBinding();
void Refresh();
void Clear();
void Save();
}
}
3.主界面
xaml:
<Window x:Class="OwnCommandDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:OwnCommandDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<local:MyCommandSource x:Name="ctrlClear" Margin="10">
<TextBlock Text="清除" FontSize="16" TextAlignment="Center" Background="LightBlue" Width="80"/>
</local:MyCommandSource>
<local:MiniView x:Name="miniView"/>
</StackPanel>
</Window>
cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace OwnCommandDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 声明命令并使用命令源和目标与之关联
ClearCommand clearCmd = new ClearCommand();
this.ctrlClear.Command = clearCmd;
this.ctrlClear.CommandTarget = this.miniView;
}
}
public class ClearCommand : ICommand
{
// 当命令可执行状态发生改变时,应当被激发
public event EventHandler CanExecuteChanged;
// 用于判断命令是否可以执行
public bool CanExecute(object parameter)
{
throw new NotImplementedException();
}
// 命令执行,带有与业务相关的Clear逻辑
public void Execute(object parameter)
{
IView view = parameter as IView;
if (view != null)
{
view.Clear();
}
}
}
// 自定义命令源
public class MyCommandSource : UserControl, ICommandSource
{
// 继承自ICommandSource的三个属性
public ICommand Command { get; set; }
public object CommandParameter { get; set; }
public IInputElement CommandTarget { get; set; }
// 在组件被单击时连带执行命令
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
// 在命令目标上执行命令,或称为让命令作用于命令目标
if (this.CommandTarget != null)
{
this.Command.Execute(this.CommandTarget);
}
}
}
}
实现效果: