using Microsoft.Office.Interop.Word; using Prism.Commands; using System; using System.Collections.Generic; using System.Diagnostics; 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 PDF_Master.CustomControl.CompositeControl { /// /// SlidComboControl.xaml 的交互逻辑 /// public partial class SlidComboControl : UserControl { public List Items { get;private set; } public event RoutedEventHandler ValueChanged; public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } } public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(SlidComboControl), new PropertyMetadata("Line Width")); //public int IndexSelected //{ // get { return (int)GetValue(IndexSelectedProperty); } // set // { // SetValue(IndexSelectedProperty, value); // } //} //public static readonly DependencyProperty IndexSelectedProperty = // DependencyProperty.Register("IndexSelected", typeof(int), typeof(SlidComboControl), new PropertyMetadata(0)); public string Unit { get { return (string)GetValue(UnitProperty); } set { SetValue(UnitProperty, value); } } public static readonly DependencyProperty UnitProperty = DependencyProperty.Register("Unit", typeof(string), typeof(SlidComboControl), new PropertyMetadata("pt")); public SlidComboControl() { InitializeComponent(); Items = new List(); DefaultItems(); SetLanguage(); } private void SetLanguage() { //焊死了 if(thicknessText.Text== "Line Width") { thicknessText.Text = App.MainPageLoader.GetString("Annotation_Thickness"); } } public void SetItemSource(List items) { Items = items; combox.ItemSource = Items; UpdateMaxMinValue(items); } private void UpdateMaxMinValue(List items) { double MaxValue = 0; double MinValue = 0; if (items != null) { foreach (var item in items) { if (item.Value >= MaxValue) MaxValue = item.Value; } MinValue = MaxValue; foreach (var item in items) { if (item.Value <= MinValue) MinValue = item.Value; } ThicknessSlider.Maximum = MaxValue; ThicknessSlider.Minimum = MinValue; } } private void DefaultItems() { var item = new ComboDataItem(3); Items.Add(item); item = new ComboDataItem(6); Items.Add(item); item = new ComboDataItem(9); Items.Add(item); item = new ComboDataItem(12); Items.Add(item); item = new ComboDataItem(15); Items.Add(item); item = new ComboDataItem(18); Items.Add(item); item = new ComboDataItem(21); Items.Add(item); item = new ComboDataItem(24); Items.Add(item); combox.ItemSource = Items; UpdateMaxMinValue(Items); } private void UserControl_Loaded(object sender, RoutedEventArgs e) { //ThicknessSlider.ValueChanged += ThicknessSlider_ValueChanged; combox.ValueChanged -= combox_ValueChanged; combox.ValueChanged += combox_ValueChanged; } private void combox_ValueChanged(object sender, RoutedEventArgs e) { if (sender is double == true) { //点击下拉框时触发 if (combox.IsExistInComBox(sender)) { Trace.WriteLine("combox_ValueChanged" + (double)sender); ThicknessSlider.Value = (double)sender; ValueChanged?.Invoke((double)sender, null); } } } //事件重复SelectedValuePropertyChanged 2023/4/4 //private void ThicknessSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) //{ // combox.SelectedItems = new ComboDataItem(Value); // // ValueChanged?.Invoke(Value, null); //} //暂无作用,后续准备 public int SelectedIndex { get { return (int)GetValue(SelectedIndexProperty); } set { SetValue(SelectedIndexProperty, value); } } public static readonly DependencyProperty SelectedIndexProperty = DependencyProperty.Register("SelectedIndex", typeof(int), typeof(SlidComboControl), new PropertyMetadata(-1, SelectedIndexPropertyChanged)); public double Value { get { return (double)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(SlidComboControl), new PropertyMetadata(1.0, SelectedValuePropertyChanged)); private static void SelectedValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as SlidComboControl; var value = (double)e.NewValue; if (control != null) { Trace.WriteLine("SelectedValuePropertyChanged" + value); control.combox.SelectedItems = new ComboDataItem(value, control.Unit); //判断滑动条的值是否与combox中的项匹配 if (control != null && control.combox.ItemSource != null) { for (int i = 0; i < control.combox.ItemSource.Count; i++) { if (value == control.combox.ItemSource[i].Value) { return; } if(i==control.combox.ItemSource.Count-1) { control.combox.SelectedIndex = -1; control.combox.SelectedItems = new ComboDataItem(value, control.Unit); } } } } } public List ItemsSource { get { return (List)GetValue(ItemsSourceProperty); } set { SetValue(ItemsSourceProperty, value); } } public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(List), typeof(SlidComboControl), new PropertyMetadata(null, SelectedItemsSourcePropertyChanged)); //选中项触发属性 private static void SelectedIndexPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as SlidComboControl; var selectedIndex = (int)e.NewValue; if (control != null /*&& control.IsSelectedEmpty == false*/) { //删掉了selectedIndex != -1,设置不选中任何选项的情况 //删掉了control.SelectedItems = null;避免崩溃 if (control.combox.Items != null && control.combox.Items.Count > 0) { control.combox.SelectedIndex = selectedIndex; if (control.combox.SelectedItems != null) control.combox.SelectedItems = (ComboDataItem)control.combox.SelectedItems; } if(e.NewValue is int index) { if (index != -1) { control.combox.UpdateSelectedIndex(); } } } } private static void SelectedItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as SlidComboControl; var value = (List)e.NewValue; if (control != null && value != null) { control.SetItemSource(value); } } private void ThicknessSlider_PreviewMouseMove(object sender, MouseEventArgs e) { if(e.LeftButton == MouseButtonState.Pressed) { ValueChanged?.Invoke(ThicknessSlider.Value, null); } } } }