using ivf_tl_CustomControls;
using ivf_tl_Entity.Entity.Mark;
using ivf_tl_Entity.Response;
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 ivf_tl_Manage.UserControls
{
///
/// MarkDetailUserControl.xaml 的交互逻辑
///
public partial class MarkDetailUserControl : UserControl
{
public event Action SaveMarkEvent;
public event Action BeforeClickEvent;
private bool isOne = true;
public MarkDetailUserControl()
{
InitializeComponent();
}
private void Cancel_Click(object sender, RoutedEventArgs e)
{
}
private void Ok_Click(object sender, RoutedEventArgs e)
{
SaveMarkEvent?.Invoke(MarkSource);
}
public MarkEntity MarkSource
{
get { return (MarkEntity)GetValue(MarkSourceProperty); }
set { SetValue(MarkSourceProperty, value); }
}
// Using a DependencyProperty as the backing store for MarkSource. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MarkSourceProperty =
DependencyProperty.Register("MarkSource", typeof(MarkEntity), typeof(MarkDetailUserControl), new PropertyMetadata(null, new PropertyChangedCallback(MarkSourcePropertyChangedCallback)));
private static void MarkSourcePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is MarkDetailUserControl source)) return;
if (e.NewValue == null)
{
source._markNewView_Grid.Children.Clear();
return;
}
if (!(e.NewValue is MarkEntity currMarkNew))
{
source._markNewView_Grid.Children.Clear();
return;
}
source.isOne = true;
source._markNewView_Grid.Children.Clear();
currMarkNew.ChildrenGrid = source._markNewView_Grid;
source.AllAddMark(currMarkNew);
}
public void AllAddMark(MarkEntity currMarkNew)
{
if (currMarkNew.children == null) return;
var childrenHaveChildren = currMarkNew.children.FirstOrDefault(x => x.child == 1);
if (childrenHaveChildren == null)
{
AddNoChildrenMarkNew(currMarkNew);
}
else
{
foreach (var markNew in currMarkNew.children)
{
markNew.ParentGrid = currMarkNew.ChildrenGrid;
AddHaveChildrenMarkNew(markNew);
AllAddMark(markNew);
}
}
}
///
/// 添加节点入口
///
///
public void AddMark(MarkEntity currMarkNew)
{
if (currMarkNew.children == null) return;
var childrenHaveChildren = currMarkNew.children.FirstOrDefault(x => x.child == 1);
if (childrenHaveChildren == null)
{
AddNoChildrenMarkNew(currMarkNew);
}
else
{
foreach (var markNew in currMarkNew.children)
{
markNew.ParentGrid = currMarkNew.ChildrenGrid;
AddHaveChildrenMarkNew(markNew);
}
}
}
///
/// 添加存在下级节点的节点
///
///
private void AddHaveChildrenMarkNew(MarkEntity markNew)
{
Grid parentGrid = markNew.ParentGrid;
if (parentGrid == null) { return; }
RowDefinition rowDefinition = new RowDefinition();
rowDefinition.Height = GridLength.Auto;
parentGrid.RowDefinitions.Add(rowDefinition);
int num = parentGrid.RowDefinitions.Count - 1;
Grid itemGrid = new Grid();
parentGrid.Children.Add(itemGrid);
Grid.SetRow(itemGrid, num);
markNew.ChildrenGrid = itemGrid;
itemGrid.Tag = true;
RowDefinition itemRowDefinition = new RowDefinition();
itemGrid.RowDefinitions.Add(itemRowDefinition);
itemRowDefinition.Height = GridLength.Auto;
Border border = new Border();
itemGrid.Children.Add(border);
Grid.SetRow(border, 0);
border.Tag = markNew;
border.Background = new SolidColorBrush(Colors.Transparent);
border.MouseUp += ShrinkOrExpandMouseup;
StackPanel stackPanel = new StackPanel();
border.Child = stackPanel;
stackPanel.Orientation = Orientation.Horizontal;
//stackPanel.Background = new SolidColorBrush(Colors.LightGreen);
//stackPanel.Background= new SolidColorBrush(Colors.LightGray);
if (isOne)
{
isOne = false;
stackPanel.Margin = new Thickness(0);
}
else
{
stackPanel.Margin = new Thickness(0,15,0,0);
}
TextBlock textBlock = new TextBlock();
Grid canvas = new Grid();
canvas.Width = 20;
canvas.Height = 20;
canvas.Margin = new Thickness(20, 0, 5, 0);
Image image = new Image();
canvas.Children.Add(image);
stackPanel.Children.Add(canvas);
stackPanel.Children.Add(textBlock);
image.Width = 20;
image.Height = 10;
markNew.FoldImage = image;
textBlock.Text = markNew.name;
image.Source = new BitmapImage(new Uri("pack://application:,,,/ivf_tl_Manage;component/Resources/Images/foldMark.png", UriKind.RelativeOrAbsolute)); //unfoldMark
if (markNew.children.Any())
{
textBlock.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4D4D4D"));
}
else
{
//image.Source = new BitmapImage(new Uri("/Image/unfoldMarkNoHave.png", UriKind.RelativeOrAbsolute));
textBlock.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#707070"));
}
textBlock.FontSize = 20;
textBlock.FontWeight = FontWeights.Medium;
}
///
/// 添加无子节点的节点
///
private void AddNoChildrenMarkNew(MarkEntity markNew)
{
try
{
var parentGrid = markNew.ChildrenGrid;
if (parentGrid == null) { return; }
RowDefinition rowDefinition = new RowDefinition();
rowDefinition.Height = GridLength.Auto;
parentGrid.RowDefinitions.Add(rowDefinition);
int num = parentGrid.RowDefinitions.Count - 1;
Border border = new Border();
border.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ECEEF2"));
parentGrid.Children.Add(border);
Grid.SetRow(border, num);
border.CornerRadius = new CornerRadius(6);
border.Margin = new Thickness(20, 10, 15, 0);
double xuanWidth = 110;
WrapPanel borderGrid = new WrapPanel();
border.Child = borderGrid;
int i = 0;
foreach (var item in markNew.children)
{
i++;
RadioButtonHaveFrame radioButton = new RadioButtonHaveFrame();
borderGrid.Children.Add(radioButton);
radioButton.FontWeight= FontWeights.Medium;
radioButton.Width = xuanWidth;
radioButton.FontSize = 16.5;
radioButton.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#9B9B9B"));
radioButton.Content = item.name;
if (i > 3)
{
radioButton.Margin = new Thickness(10, 0, 0, 10);
}
else
{
radioButton.Margin = new Thickness(10, 10, 0, 10);
}
radioButton.Tag = item;
radioButton.CheckImageSource = new BitmapImage(new Uri("pack://application:,,,/ivf_tl_Manage;component/Resources/Images/CheckRadioButtonIcon.png", UriKind.Absolute));
if (markNew.CurrentValue != null && markNew.CurrentValue.id == item.id)
{
markNew.CurrentValue = item;
radioButton.IsChecked = true;
}
radioButton.Checked += (sender, arg) =>
{
BeforeClickEvent?.Invoke();
markNew.CurrentValue = item; //获取选定的值
};
}
}
catch (Exception ex)
{
}
}
///
/// 标记展开或者收缩
///
///
///
///
private void ShrinkOrExpandMouseup(object sender, MouseButtonEventArgs e)
{
BeforeClickEvent?.Invoke();
if (!(sender is Border border)) return;
if (!(border.Tag is MarkEntity markNew)) return;
if (markNew.ChildrenGrid == null) return;
if (!markNew.children.Any())
{
return;
}
bool newTag = !bool.Parse(markNew.ChildrenGrid.Tag.ToString());
markNew.ChildrenGrid.Tag = newTag;
if (newTag)
{
Expand(markNew);
}
else
{
Shrink(markNew);
}
}
///
/// 展开
///
///
private void Expand(MarkEntity markNew)
{
Image image = markNew.FoldImage;
AddMark(markNew);
if (image != null)
{
image.Width = 20;
image.Height = 10;
image.Source = new BitmapImage(new Uri("pack://application:,,,/ivf_tl_Manage;component/Resources/Images/foldMark.png", UriKind.RelativeOrAbsolute));
}
}
///
/// 收缩
///
///
private void Shrink(MarkEntity markNew)
{
Image image = markNew.FoldImage;
if (markNew.ChildrenGrid.RowDefinitions.Count > 1)
{
if (image != null)
{
image.Width = 10;
image.Height = 20;
image.Source = new BitmapImage(new Uri("pack://application:,,,/ivf_tl_Manage;component/Resources/Images/unfoldMark.png", UriKind.RelativeOrAbsolute));
}
int k = markNew.ChildrenGrid.RowDefinitions.Count;
for (int i = 1; i < k; i++)
{
markNew.ChildrenGrid.Children.RemoveAt(1);
markNew.ChildrenGrid.RowDefinitions.RemoveAt(1);
}
}
}
private void ScrollViewer_ManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
e.Handled = true;
}
private void GetLeafParentNodeList(MarkEntity markEntity, List list)
{
if (markEntity.child != 1) return;
if (markEntity.children != null && markEntity.children.Any())
{
var a = markEntity.children.FirstOrDefault(x => x.child == 1);
if (a == null)
{
list.Add(markEntity);
return;
}
foreach (var item in markEntity.children)
{
GetLeafParentNodeList(item, list);
}
return;
}
list.Add(markEntity);
}
}
}