WPF登录界面及程序主界面设计

时间:2022-07-07 05:37:48

    本博文为WPF编写的 管理系统登录界面,及几个管理系统主界面设计   先上图看一下效果

 

主界面:WPF登录界面及程序主界面设计

  图一:登录界面  WPF登录界面及程序主界面设计WPF登录界面及程序主界面设计  

 

 

图片二.登录数据准备中WPF登录界面及程序主界面设计

现在开始上源码:

登录界面前台源码:

<Window x:Class="WPFLoginDemo.LoginWindow"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
Title
="登录" Height="300" Width="400"
WindowStartupLocation
="CenterScreen"
WindowStyle
="None"
FocusManager.FocusedElement
="{Binding ElementName=txt_userName}"
Loaded
="Window_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="40"/>
</Grid.ColumnDefinitions>
<Grid.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#5aacf6" Offset="0.0"/>
<GradientStop Color="#0056f1" Offset="0.2"/>
<GradientStop Color="#13ceff" Offset="0.4"/>
<GradientStop Color="#006bff" Offset="0.6"/>
<GradientStop Color="#19d5ff" Offset="0.8"/>
<GradientStop Color="#5aacf6" Offset="1.0"/>
</LinearGradientBrush>
</Grid.Background>
<TextBlock Grid.Row="2" Grid.ColumnSpan="3"
Text
="XXX管理系统V1.1.001版" TextAlignment="Center"
VerticalAlignment
="Center" FontSize="22"></TextBlock>
<TextBlock Grid.Row="3" TextAlignment="Right" VerticalAlignment="Center"
Text
="用户名:"/>
<TextBox Grid.Row="3" Grid.Column="1" Height="27" Margin="5 0 5 0"
Name
="txt_userName"/>
<TextBlock Grid.Row="4" TextAlignment="Right" VerticalAlignment="Center"
Text
="密 码:"/>
<PasswordBox Grid.Row="4" Grid.Column="1" Height="27" Margin="5 0 5 0"
Name
="txt_Pwd"/>
<StackPanel Grid.Row="5" Grid.Column="1" Orientation="Horizontal">
<Button Content="登录" Width="70" Margin="30 0 0 0" Height="35"
Name
="btn_login" Click="btn_login_Click" Foreground="White" FontSize="18" Background="Transparent"/>
<Button Content="退出" Width="70" Margin="40 0 0 0" Height="35"
Name
="btn_exit" Click="btn_exit_Click" Background="Transparent" Foreground="White" FontSize="18"/>
</StackPanel>
</Grid>
</Window>

后台源码

  private void btn_login_Click(object sender, RoutedEventArgs e)
{
Splasher.Show(
typeof(frmSplash));
MainWindow mainWindow
= new MainWindow();
this.Close();
mainWindow.Show();
}
private void btn_exit_Click(object sender, RoutedEventArgs e)
{
this.Close();
Environment.Exit(
0);
}

这里顺便说一下。在登录到主界面时,一般程序都要加载一些配置数据信息,这个一般般比较耗时,为了提高更好的用户体验 我们加载了一个加载提示窗口
此提示窗口是修改别人。

第一步:创建一个提示窗口(如图二)(本窗口为Winform窗口),本窗口本打算改为WPF的可是,改了之后发现无法运行,如果谁修改好了 请把源码贴出来学习一下

窗口后台源码:

public partial class frmSplash : Form,ISplashForm
{
public frmSplash()
{
InitializeComponent();
}

#region ISplashForm

void ISplashForm.SetStatusInfo(string NewStatusInfo)
{
lbStatusInfo.Text
= NewStatusInfo;
}

#endregion
}

用到的 接口文件:ISplashForm.cs

  public interface ISplashForm
{
void SetStatusInfo(string NewStatusInfo);
}

实现辅助类:Splasher.cs

  public class Splasher
{
private static Form m_SplashForm = null;
private static ISplashForm m_SplashInterface = null;
private static Thread m_SplashThread = null;
private static string m_TempStatus = string.Empty;

/// <summary>
/// Show the SplashForm
/// </summary>
public static void Show(Type splashFormType)
{
if (m_SplashThread != null)
return;
if (splashFormType == null)
{
throw (new Exception("splashFormType is null"));
}

m_SplashThread
= new Thread(new ThreadStart(delegate()
{
CreateInstance(splashFormType);
Application.Run(m_SplashForm);
}));

m_SplashThread.IsBackground
= true;
m_SplashThread.SetApartmentState(ApartmentState.STA);
m_SplashThread.Start();
}



/// <summary>
/// set the loading Status
/// </summary>
public static string Status
{
set
{
if (m_SplashInterface == null || m_SplashForm == null)
{
m_TempStatus
= value;
return;
}
m_SplashForm.Invoke(
new SplashStatusChangedHandle(delegate(string str) { m_SplashInterface.SetStatusInfo(str); }),
new object[] { value }
);
}

}

/// <summary>
/// Colse the SplashForm
/// </summary>
public static void Close()
{
if (m_SplashThread == null || m_SplashForm == null) return;

try
{
m_SplashForm.Invoke(
new MethodInvoker(m_SplashForm.Close));
}
catch (Exception)
{
}
m_SplashThread
= null;
m_SplashForm
= null;
}

private static void CreateInstance(Type FormType)
{

object obj = FormType.InvokeMember(null,
BindingFlags.DeclaredOnly
|
BindingFlags.Public
| BindingFlags.NonPublic |
BindingFlags.Instance
| BindingFlags.CreateInstance, null, null, null);
m_SplashForm
= obj as Form;
m_SplashInterface
= obj as ISplashForm;
if (m_SplashForm == null)
{
throw (new Exception("Splash Screen must inherit from System.Windows.Forms.Form"));
}
if (m_SplashInterface == null)
{
throw (new Exception("must implement interface ISplashForm"));
}

if (!string.IsNullOrEmpty(m_TempStatus))
m_SplashInterface.SetStatusInfo(m_TempStatus);
}


private delegate void SplashStatusChangedHandle(string NewStatusInfo);

}

主界面加载耗时的数据

 public MainWindow()
{
InitializeComponent();

//登录是使用
Splasher.Status = "正在准备数据......";
System.Threading.Thread.Sleep(
1000);

Splasher.Status
= "正在添加组件......";
//此处省略部分加载耗时的代码

Splasher.Status
= "正在获取数据库数据......";
System.Threading.Thread.Sleep(
1000);
Splasher.Status
= "初始化完毕";
System.Threading.Thread.Sleep(
300);

Splasher.Close();
}

主界面布局出来前台源码

<Window xmlns:my="clr-namespace:WPFLoginDemo.CustomerControl"  x:Class="WPFLoginDemo.MainWindow"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
WindowStartupLocation
="CenterScreen"
Width
="1024" Height="768"
Title
="XXX管理系统V1.1.001版" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
<Window.Resources>
<!--Separator控件模块样式-->
<Style x:Key="CorrectSeparatorStyle" TargetType="{x:Type Separator}">
<Setter Property="Background">
<Setter.Value>
<RadialGradientBrush>
<GradientStop Color="#ffffff" Offset="0"/>
<GradientStop Color="#ffffff" Offset="0.2"/>
<GradientStop Color="#ffffff" Offset="0.3"/>
<GradientStop Color="#ffffff" Offset="0.4"/>
<GradientStop Color="#0067c9" Offset="1"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Margin" Value="0,2,0,2"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="Height" Value="1"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Separator}">
<Border Background="{TemplateBinding Background}">
<Line Stretch="Fill" X2="1" Stroke="{TemplateBinding Background}" StrokeThickness="{TemplateBinding Height}"
StrokeStartLineCap
="Square" StrokeEndLineCap="Square"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!--Button控件模块样式-->
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Height" Value="43"/>
<Setter Property="FontSize" Value="20"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<!--修改模板属性-->
<Setter Property="Template">
<Setter.Value>
<!--控件模板-->
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="fore" BorderThickness="0" CornerRadius="3" BorderBrush="#5555" Background="{TemplateBinding Background}">
<ContentPresenter x:Name="content" HorizontalAlignment="Center" VerticalAlignment="Center"
Content
="{TemplateBinding Content}">
<ContentPresenter.BitmapEffect>
<DropShadowBitmapEffect Color="#000" Direction="-90" ShadowDepth="2" Softness="0.1" Opacity="0.3"/>
</ContentPresenter.BitmapEffect>
</ContentPresenter>
</Border>
<ControlTemplate.Triggers>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="60"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<!--菜单栏-->
<Menu Grid.ColumnSpan="3">
<MenuItem Header="【基础资料】"/>
<MenuItem Header="【客户维修】"/>
<MenuItem Header="【销售管理】"/>
<MenuItem Header="【报表查询】"/>
<MenuItem Header="【用户管理】"/>
<MenuItem Header="【系统设置】"/>
<MenuItem Header="【帮助】"/>
</Menu>
<!--logo图片 Heard 头部-->
<TextBlock Text="XXX管理系统" Grid.Row="1" Grid.ColumnSpan="3" TextAlignment="Center"
Foreground
="#ffffff" Padding="0 8 0 0" FontSize="30" FontWeight="Bold" HorizontalAlignment="Stretch">
<TextBlock.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#5aacf6" Offset="0.0"/>
<GradientStop Color="#0056f1" Offset="0.2"/>
<GradientStop Color="#13ceff" Offset="0.4"/>
<GradientStop Color="#006bff" Offset="0.6"/>
<GradientStop Color="#19d5ff" Offset="0.8"/>
<GradientStop Color="#5aacf6" Offset="1.0"/>
</LinearGradientBrush>
</TextBlock.Background>
</TextBlock>
<!--分割线-->
<StackPanel Grid.Row="2" Grid.ColumnSpan="3">
<Separator Style="{StaticResource ResourceKey=CorrectSeparatorStyle}" Height="5" Background="#c0c0c0">
</Separator>
</StackPanel>
<!--主操作区域-->
<Grid Grid.Row="3" Grid.ColumnSpan="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="170"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!--左侧菜单栏-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="主菜单栏" Padding="0 7 0 0" TextAlignment="Center" FontSize="20" Foreground="#fafafa" FontWeight="Bold" Height="40">
<TextBlock.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#f9f9f9" Offset="0"/>
<GradientStop Color="#ababab" Offset="0.3"/>
<GradientStop Color="#b4b4b4" Offset="0.5"/>
<GradientStop Color="#d2d2d2" Offset="0.75"/>
<GradientStop Color="#dedee0" Offset="1"/>
</LinearGradientBrush>
</TextBlock.Background>
</TextBlock>
<StackPanel Name="stackPanel1" Orientation="Vertical" Grid.Row="1" ButtonBase.Click="btn_customer_Click">
<StackPanel.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#005fc3" Offset="0"/>
<GradientStop Color="#0c70e5" Offset="0.5"/>
<GradientStop Color="#008ae5" Offset="1"/>
</LinearGradientBrush>
</StackPanel.Background>
<!--客户维修-->
<Button Name="btn_Repair" Content="客户维修" Style="{StaticResource ResourceKey=buttonStyle}" Click="btn_Repair_Click"></Button>
<Separator Height="4" Style="{StaticResource ResourceKey=CorrectSeparatorStyle}"></Separator>
<!--销售管理-->
<Button Content="销售管理" Style="{StaticResource ResourceKey=buttonStyle}"></Button>
<Separator Height="4" Style="{StaticResource ResourceKey=CorrectSeparatorStyle}"></Separator>
<!--报表查询-->
<Button Content="报表查询" Style="{StaticResource ResourceKey=buttonStyle}"></Button>
<Separator Height="4" Style="{StaticResource ResourceKey=CorrectSeparatorStyle}"></Separator>
<!--基础资料-->
<Button Content="基础资料" Style="{StaticResource ResourceKey=buttonStyle}"></Button>
<Separator Height="4" Style="{StaticResource ResourceKey=CorrectSeparatorStyle}"></Separator>
<!--发货处理-->
<Button Content="发货处理" Style="{StaticResource ResourceKey=buttonStyle}"></Button>
<Separator Height="4" Style="{StaticResource ResourceKey=CorrectSeparatorStyle}"></Separator>
<!--用户管理-->
<Button Content="用户管理" Style="{StaticResource ResourceKey=buttonStyle}"></Button>
<Separator Height="4" Style="{StaticResource ResourceKey=CorrectSeparatorStyle}"></Separator>
<!--系统设置-->
<Button Content="系统设置" Style="{StaticResource ResourceKey=buttonStyle}"></Button>
</StackPanel>
</Grid>
<!--右侧功能处理-->
<StackPanel Name="stackPanelRight" Grid.Column="1">
<StackPanel.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#f3fbfa" Offset="0.0"/>
<GradientStop Color="#eef9fa" Offset="0.2"/>
<GradientStop Color="#c5e2f5" Offset="0.4"/>
<GradientStop Color="#91d3f5" Offset="0.6"/>
<GradientStop Color="#8ed4f6" Offset="0.8"/>
<GradientStop Color="#7ed0f6" Offset="1.0"/>
</LinearGradientBrush>
</StackPanel.Background>
</StackPanel>
</Grid>
<!--状态栏-->
<StatusBar Grid.Row="4" Grid.ColumnSpan="3" VerticalAlignment="Center" Background="Beige">
<StatusBarItem Content="数据帐套:正式帐套"/>
<StatusBarItem Content="岗位名称:仓库管理员" Margin="25 0 0 0"/>
<StatusBarItem Content="登录用户名:系统管理员" Margin="25 0 0 0"/>
<StatusBarItem Content="登录时间:2013年11月20日 13:54:08 星期一" Margin="25 0 0 0"/>
</StatusBar>
</Grid>
</Window>

后台源码出来

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

//登录是使用
Splasher.Status = "正在准备数据......";
System.Threading.Thread.Sleep(
1000);

Splasher.Status
= "正在添加组件......";
//此处省略部分加载耗时的代码

Splasher.Status
= "正在获取数据库数据......";
System.Threading.Thread.Sleep(
1000);
Splasher.Status
= "初始化完毕";
System.Threading.Thread.Sleep(
300);

Splasher.Close();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
btn_Repair_Click(
null, null);
}
/// <summary>
/// 获取渐变效果
/// </summary>
/// <returns></returns>
private LinearGradientBrush GetLinearGradientBrush()
{
LinearGradientBrush linearGradient
= new LinearGradientBrush();
linearGradient.StartPoint
= new System.Windows.Point(0, 0.5);
linearGradient.EndPoint
= new System.Windows.Point(1, 0.5);
linearGradient.GradientStops.Add(
new GradientStop((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#0057bf"), 0.0));
linearGradient.GradientStops.Add(
new GradientStop((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#4b8acf"), 0.1));
linearGradient.GradientStops.Add(
new GradientStop((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#e2ecf6"), 0.3));
linearGradient.GradientStops.Add(
new GradientStop((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#ffffff"), 0.5));
linearGradient.GradientStops.Add(
new GradientStop((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#e2ecf6"), 0.8));
linearGradient.GradientStops.Add(
new GradientStop((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#4b8acf"), 0.1));
linearGradient.GradientStops.Add(
new GradientStop((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#0057bf"), 1.0));
return linearGradient;
}
private void SetButtonDefaultBackgroud()
{
LogicTree(stackPanel1);
}
private void LogicTree(object obj)
{
if (!(obj is DependencyObject))
{
return;
}
foreach (object child in LogicalTreeHelper.GetChildren(obj as DependencyObject))
{
if (child is Button)
{
Button btn
= (Button)child;
btn.Background
= System.Windows.Media.Brushes.Transparent;
}
LogicTree(child);
}
}
private double originalHeight = 0.0;
private void btn_customer_Click(object sender, RoutedEventArgs e)
{
originalHeight
= stackPanelRight.ActualHeight;

SetButtonDefaultBackgroud();
Button btn
= e.OriginalSource as Button;
btn.Background
= GetLinearGradientBrush();
UserControl userControl
= null;
stackPanelRight.Children.Clear();
if (btn.Content.ToString().Equals("客户维修"))
{
userControl
= new CustomerRepairUserControl();
}
stackPanelRight.Children.Add(userControl);
}

//主界面窗口大小的变化
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (this.WindowState == WindowState.Maximized)
{
CustomerData.AddHeight
= (stackPanelRight.ActualHeight - originalHeight) / 3 + 35.0;
}
else
{
CustomerData.AddHeight
= 35.0;
}

}

private void btn_Repair_Click(object sender, RoutedEventArgs e)
{
originalHeight
= stackPanelRight.ActualHeight;

SetButtonDefaultBackgroud();
Button btn
= btn_Repair;
btn.Background
= GetLinearGradientBrush();
UserControl userControl
= null;
stackPanelRight.Children.Clear();
if (btn.Content.ToString().Equals("客户维修"))
{
userControl
= new CustomerRepairUserControl();
}
stackPanelRight.Children.Add(userControl);
}

右侧流程功能处理 为一个布局好UserControl 控件  CustomerRepairUserControl.xaml
UserControl控件布局 图片:WPF登录界面及程序主界面设计

<UserControl x:Class="WPFLoginDemo.CustomerControl.CustomerRepairUserControl"
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"
mc:Ignorable
="d"
xmlns:shape
="clr-namespace:WPFLoginDemo.CustomerControl"
d:DesignHeight
="600" d:DesignWidth="850" SizeChanged="UserControl_SizeChanged">
<UserControl.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,1" EndPoint="1,1">
<GradientStop Color="#c7daea" Offset="0.0"/>
<GradientStop Color="#cadcf0" Offset="0.4"/>
<GradientStop Color="#d6e9ff" Offset="0.7"/>
<GradientStop Color="#eef6ff" Offset="1.0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid Name="grid1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="40"/>
<RowDefinition Height="60"/>
<RowDefinition Height="40"/>
<RowDefinition Height="60"/>
<RowDefinition Height="40"/>
<RowDefinition Height="60"/>
<RowDefinition Height="40"/>
<RowDefinition Height="60"/>
<RowDefinition Height="40"/>
<RowDefinition Height="60"/>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<!--内容填充-->
<!--客户送修登记-->
<TextBlock Name="txtB_row" Grid.ColumnSpan="8" Text=""></TextBlock>
<Button Grid.Column="3" Grid.Row="1" Content="送修登记新增"/>
<StackPanel Grid.Column="3" Grid.Row="2" Orientation="Vertical">
<shape:Arrow X1="50" Y1="0" X2="50" Y2="60" Height="60" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<!--送修登记查询-->
<StackPanel Grid.Column="4" Grid.Row="1" Orientation="Horizontal">
<shape:Arrow X1="0" Y1="20" X2="150" Y2="20" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="5" Grid.Row="1" Content="送修登记查询"/>
<!--客户检测新增-->
<Button Grid.Row="3" Grid.Column="3" Content="客户检测新增"/>
<StackPanel Grid.Row="4" Grid.Column="3" Orientation="Vertical">
<shape:Arrow X1="50" Y1="0" X2="50" Y2="60" Height="60" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<!--客户检测查询-->
<StackPanel Grid.Column="4" Grid.Row="3" Orientation="Horizontal">
<shape:Arrow X1="0" Y1="20" X2="150" Y2="20" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="5" Grid.Row="3" Content="客户检测查询"/>

<!--原厂配件登记-->
<StackPanel Grid.Column="2" Grid.Row="3" Orientation="Horizontal">
<shape:Arrow X1="150" Y1="20" X2="0" Y2="20" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="1" Grid.Row="3" Content="原厂配件登记"/>
<StackPanel Grid.Column="2" Grid.Row="2" Orientation="Horizontal">
<shape:Arrow X1="150" Y1="60" X2="0" Y2="0" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="1" Grid.Row="1" Content="异常单据查找"/>
<!--主要报表查询-->
<Button Grid.Column="1" Grid.Row="5" Content="汇总查询分析"/>
<Button Grid.Column="1" Grid.Row="7" Content="故障统计分析"/>
<Button Grid.Column="1" Grid.Row="9" Content="维修记录统计"/>
<Button Grid.Column="1" Grid.Row="11" Content="快递单打印"/>
<!--产品报价新增-->
<Button Grid.Row="5" Grid.Column="3" Content="产品报价新增"/>
<StackPanel Grid.Row="6" Grid.Column="3" Orientation="Vertical">
<shape:Arrow X1="50" Y1="0" X2="50" Y2="60" Height="60" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<!--产品报价查询-->
<StackPanel Grid.Column="4" Grid.Row="5" Orientation="Horizontal">
<shape:Arrow X1="0" Y1="20" X2="150" Y2="20" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="5" Grid.Row="5" Content="产品报价查询"/>
<!--配件领料新增-->
<Button Grid.Row="7" Grid.Column="3" Content="配件领料新增"/>
<StackPanel Grid.Row="8" Grid.Column="3" Orientation="Vertical">
<shape:Arrow X1="50" Y1="0" X2="50" Y2="60" Height="60" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<!--配件领料查询-->
<StackPanel Grid.Column="4" Grid.Row="7" Orientation="Horizontal">
<shape:Arrow X1="0" Y1="20" X2="150" Y2="20" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="5" Grid.Row="7" Content="配件领料查询"/>
<!--维修结案新增-->
<Button Grid.Row="9" Grid.Column="3" Content="维修结案新增"/>
<StackPanel Grid.Row="10" Grid.Column="3" Orientation="Vertical">
<shape:Arrow X1="50" Y1="0" X2="50" Y2="60" Height="60" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<!--维修结案查询-->
<StackPanel Grid.Column="4" Grid.Row="9" Orientation="Horizontal">
<shape:Arrow X1="0" Y1="20" X2="150" Y2="20" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="5" Grid.Row="9" Content="维修结案查询"/>
<!--维修发货新增-->
<Button Grid.Row="11" Grid.Column="3" Content="维修发货新增"/>
<StackPanel Grid.Column="4" Grid.Row="11" Orientation="Horizontal">
<shape:Arrow X1="0" Y1="20" X2="150" Y2="20" Width="150" HeadWidth="7" HeadHeight="5" Stroke="Black" StrokeThickness="0.8" />
</StackPanel>
<Button Grid.Column="5" Grid.Row="11" Content="维修发货追踪"/>
</Grid>
</UserControl>

下面为 画箭头使用的类

public sealed class Arrow : Shape
{
public static readonly DependencyProperty X1Property = DependencyProperty.Register("X1", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
public static readonly DependencyProperty Y1Property = DependencyProperty.Register("Y1", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
public static readonly DependencyProperty X2Property = DependencyProperty.Register("X2", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
public static readonly DependencyProperty Y2Property = DependencyProperty.Register("Y2", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
public static readonly DependencyProperty HeadWidthProperty = DependencyProperty.Register("HeadWidth", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
public static readonly DependencyProperty HeadHeightProperty = DependencyProperty.Register("HeadHeight", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
[TypeConverter(
typeof(LengthConverter))]
public double X1
{
get { return (double)base.GetValue(X1Property); }
set { base.SetValue(X1Property, value); }
}
[TypeConverter(
typeof(LengthConverter))]
public double Y1
{
get { return (double)base.GetValue(Y1Property); }
set { base.SetValue(Y1Property, value); }
}
[TypeConverter(
typeof(LengthConverter))]
public double X2
{
get { return (double)base.GetValue(X2Property); }
set { base.SetValue(X2Property, value); }
}
[TypeConverter(
typeof(LengthConverter))]
public double Y2
{
get { return (double)base.GetValue(Y2Property); }
set { base.SetValue(Y2Property, value); }
}
[TypeConverter(
typeof(LengthConverter))]
public double HeadWidth
{
get { return (double)base.GetValue(HeadWidthProperty); }
set { base.SetValue(HeadWidthProperty, value); }
}
[TypeConverter(
typeof(LengthConverter))]
public double HeadHeight
{
get { return (double)base.GetValue(HeadHeightProperty); }
set { base.SetValue(HeadHeightProperty, value); }
}
protected override Geometry DefiningGeometry
{
get
{
// Create a StreamGeometry for describing the shape
StreamGeometry geometry = new StreamGeometry();
geometry.FillRule
= FillRule.EvenOdd;

using (StreamGeometryContext context = geometry.Open())
{
InternalDrawArrowGeometry(context);
}

// Freeze the geometry for performance benefits
geometry.Freeze();

return geometry;
}
}
private void InternalDrawArrowGeometry(StreamGeometryContext context)
{
double theta = Math.Atan2(Y1 - Y2, X1 - X2);
double sint = Math.Sin(theta);
double cost = Math.Cos(theta);

Point pt1
= new Point(X1, this.Y1);
Point pt2
= new Point(X2, this.Y2);

Point pt3
= new Point(
X2
+ (HeadWidth * cost - HeadHeight * sint),
Y2
+ (HeadWidth * sint + HeadHeight * cost));

Point pt4
= new Point(
X2
+ (HeadWidth * cost + HeadHeight * sint),
Y2
- (HeadHeight * cost - HeadWidth * sint));

context.BeginFigure(pt1,
true, false);
context.LineTo(pt2,
true, true);
context.LineTo(pt3,
true, true);
context.LineTo(pt2,
true, true);
context.LineTo(pt4,
true, true);
}


}

 

 

 public class CustomerData
{
public static double AddHeight = 35.0;
}

 本人说水平有限,请批评指正。  

 UserControl 在加入到 主界面是,Width 会随主界面最大化 变大而变大,而Height 侧不会。望大家提出怎么解决。