调整流水线算子参数区 滑块控件的大小

This commit is contained in:
zhengxuan.zhang
2026-05-06 13:25:18 +08:00
parent 2eb3fed4d0
commit a483144d29
7 changed files with 199 additions and 31 deletions
@@ -16,8 +16,8 @@
Background="Transparent"
BorderBrush="#FFD5DFE5"
BorderThickness="1"
Padding="10"
Margin="0,0,0,10">
Padding="8"
Margin="0,0,0,8">
<StackPanel>
<TextBlock x:Name="txtProcessorName"
FontSize="14"
@@ -32,7 +32,7 @@
<!-- 参数列表 -->
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel x:Name="pnlParameters" Margin="5" />
<StackPanel x:Name="pnlParameters" Margin="2" />
</ScrollViewer>
</Grid>
</UserControl>
</UserControl>
@@ -143,12 +143,15 @@ public partial class ProcessorParameterControl : UserControl
var textBox = new TextBox
{
Text = param.Value.ToString(),
Width = 100,
HorizontalAlignment = HorizontalAlignment.Left
Width = 56,
MinWidth = 56,
HorizontalContentAlignment = HorizontalAlignment.Center,
VerticalContentAlignment = VerticalAlignment.Center
};
if (param.MinValue != null && param.MaxValue != null)
{
var rangeGrid = CreateRangeEditorContainer();
var slider = new Slider
{
Minimum = Convert.ToDouble(param.MinValue),
@@ -156,7 +159,8 @@ public partial class ProcessorParameterControl : UserControl
Value = Convert.ToDouble(param.Value),
TickFrequency = 1,
IsSnapToTickEnabled = true,
Margin = new Thickness(0, 0, 0, 5)
MinWidth = 120,
VerticalAlignment = VerticalAlignment.Center
};
slider.ValueChanged += (s, e) =>
@@ -181,7 +185,11 @@ public partial class ProcessorParameterControl : UserControl
}
};
panel.Children.Add(slider);
Grid.SetColumn(slider, 0);
Grid.SetColumn(textBox, 2);
rangeGrid.Children.Add(slider);
rangeGrid.Children.Add(textBox);
panel.Children.Add(rangeGrid);
}
else
{
@@ -193,9 +201,9 @@ public partial class ProcessorParameterControl : UserControl
OnParameterChanged();
}
};
}
panel.Children.Add(textBox);
panel.Children.Add(textBox);
}
return panel;
}
@@ -211,19 +219,23 @@ public partial class ProcessorParameterControl : UserControl
var textBox = new TextBox
{
Text = Convert.ToDouble(param.Value).ToString("F2"),
Width = 100,
HorizontalAlignment = HorizontalAlignment.Left
Width = 56,
MinWidth = 56,
HorizontalContentAlignment = HorizontalAlignment.Center,
VerticalContentAlignment = VerticalAlignment.Center
};
if (param.MinValue != null && param.MaxValue != null)
{
var rangeGrid = CreateRangeEditorContainer();
var slider = new Slider
{
Minimum = Convert.ToDouble(param.MinValue),
Maximum = Convert.ToDouble(param.MaxValue),
Value = Convert.ToDouble(param.Value),
TickFrequency = 0.1,
Margin = new Thickness(0, 0, 0, 5)
MinWidth = 120,
VerticalAlignment = VerticalAlignment.Center
};
slider.ValueChanged += (s, e) =>
@@ -248,7 +260,11 @@ public partial class ProcessorParameterControl : UserControl
}
};
panel.Children.Add(slider);
Grid.SetColumn(slider, 0);
Grid.SetColumn(textBox, 2);
rangeGrid.Children.Add(slider);
rangeGrid.Children.Add(textBox);
panel.Children.Add(rangeGrid);
}
else
{
@@ -260,9 +276,9 @@ public partial class ProcessorParameterControl : UserControl
OnParameterChanged();
}
};
}
panel.Children.Add(textBox);
panel.Children.Add(textBox);
}
return panel;
}
@@ -302,8 +318,8 @@ public partial class ProcessorParameterControl : UserControl
var comboBox = new ComboBox
{
Margin = new Thickness(0, 5, 0, 0),
Width = 200,
HorizontalAlignment = HorizontalAlignment.Left
MinWidth = 160,
HorizontalAlignment = HorizontalAlignment.Stretch
};
if (param.Options != null)
@@ -344,8 +360,8 @@ public partial class ProcessorParameterControl : UserControl
{
Text = param.Value?.ToString() ?? "",
Margin = new Thickness(0, 5, 0, 0),
Width = 200,
HorizontalAlignment = HorizontalAlignment.Left
MinWidth = 160,
HorizontalAlignment = HorizontalAlignment.Stretch
};
textBox.TextChanged += (s, e) =>
@@ -374,4 +390,16 @@ public partial class ProcessorParameterControl : UserControl
pnlParameters.Children.Clear();
UpdateNoProcessorText();
}
}
private static Grid CreateRangeEditorContainer()
{
var grid = new Grid
{
Margin = new Thickness(0, 0, 0, 4)
};
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(6) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
return grid;
}
}
@@ -39,7 +39,15 @@ namespace XplorePlane.ViewModels
public string ParameterType { get; }
public bool HasOptions => Options is { Length: > 0 };
public bool IsBool => ParameterType == "bool";
public bool IsTextInput => !IsBool && !HasOptions;
public bool IsNumeric => ParameterType is "int" or "double";
public bool HasRange => IsNumeric && MinValue != null && MaxValue != null;
public bool IsSliderInput => HasRange;
public bool IsTextInput => !IsBool && !HasOptions && !IsSliderInput;
public double SliderMinimum => TryConvertToDouble(MinValue, out var minValue) ? minValue : 0d;
public double SliderMaximum => TryConvertToDouble(MaxValue, out var maxValue) ? maxValue : 100d;
public double SliderTickFrequency => ResolveTickFrequency();
public bool IsIntegerSlider => ParameterType == "int";
public bool IsValueValid
{
@@ -60,10 +68,46 @@ namespace XplorePlane.ViewModels
RaisePropertyChanged(nameof(Value));
RaisePropertyChanged(nameof(BoolValue));
RaisePropertyChanged(nameof(SelectedOption));
RaisePropertyChanged(nameof(SliderValue));
RaisePropertyChanged(nameof(DisplayValueText));
}
}
}
public double SliderValue
{
get => TryConvertToDouble(_value, out var sliderValue) ? sliderValue : SliderMinimum;
set
{
if (!IsSliderInput)
{
return;
}
Value = ParameterType == "int"
? (object)Convert.ToInt32(Math.Round(value, MidpointRounding.AwayFromZero), CultureInfo.InvariantCulture)
: Math.Round(value, ResolveDecimalPlaces(), MidpointRounding.AwayFromZero);
}
}
public string DisplayValueText
{
get
{
if (ParameterType == "int" && TryConvertToInt(_value, out var intValue))
{
return intValue.ToString(CultureInfo.InvariantCulture);
}
if (ParameterType == "double" && TryConvertToDouble(_value, out var doubleValue))
{
return doubleValue.ToString($"F{ResolveDecimalPlaces()}", CultureInfo.InvariantCulture);
}
return Convert.ToString(_value, CultureInfo.InvariantCulture) ?? string.Empty;
}
}
public bool BoolValue
{
get => ParameterType == "bool" && TryConvertToBool(_value, out var boolValue) && boolValue;
@@ -154,6 +198,58 @@ namespace XplorePlane.ViewModels
return true;
}
private double ResolveTickFrequency()
{
if (!HasRange)
{
return 1d;
}
if (ParameterType == "int")
{
return 1d;
}
double range = SliderMaximum - SliderMinimum;
if (range <= 1d)
{
return 0.01d;
}
if (range <= 10d)
{
return 0.1d;
}
return 1d;
}
private int ResolveDecimalPlaces()
{
if (ParameterType == "int")
{
return 0;
}
double tick = SliderTickFrequency;
if (tick >= 1d)
{
return 0;
}
if (tick >= 0.1d)
{
return 1;
}
if (tick >= 0.01d)
{
return 2;
}
return 3;
}
private static string NormalizeNumericText(string value)
{
return value.Trim().TrimEnd('、', '', ',', '。', '.', ';', '', ':', '');
+1 -1
View File
@@ -23,7 +23,7 @@ namespace XplorePlane.ViewModels
{
public class MainViewModel : BindableBase
{
private const double CncEditorHostWidth = 402d;
private const double CncEditorHostWidth = 452d;
private readonly ILoggerService _logger;
private readonly IContainerProvider _containerProvider;
+4 -4
View File
@@ -10,7 +10,7 @@
xmlns:views="clr-namespace:XplorePlane.Views"
xmlns:vm="clr-namespace:XplorePlane.ViewModels.Cnc"
d:DesignHeight="760"
d:DesignWidth="402"
d:DesignWidth="452"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d">
@@ -114,8 +114,8 @@
</UserControl.Resources>
<Border
Width="402"
MinWidth="402"
Width="452"
MinWidth="452"
HorizontalAlignment="Left"
Background="{StaticResource PanelBg}"
BorderBrush="{StaticResource PanelBorder}"
@@ -123,7 +123,7 @@
CornerRadius="4">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="180" />
<ColumnDefinition Width="1" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
@@ -63,7 +63,7 @@
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Foreground" Value="#1c1c1b" />
<Setter Property="BorderBrush" Value="#cdcbcb" />
<Setter Property="Padding" Value="4,6,4,4" />
<Setter Property="Padding" Value="3,4,3,3" />
</Style>
</UserControl.Resources>
@@ -145,7 +145,7 @@
<!-- 右侧:算子选择 + 参数配置 -->
<Border Grid.Column="3" Style="{StaticResource PanelBorderStyle}">
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="10,8,10,10">
<StackPanel Margin="8,6,8,8">
<GroupBox Margin="0,0,0,8" Header="选择算子">
<ComboBox
@@ -204,4 +204,4 @@
</Grid>
</Border>
</Grid>
</UserControl>
</UserControl>
@@ -317,9 +317,53 @@
Text="{Binding DisplayName}"
TextTrimming="CharacterEllipsis" />
<Grid Grid.Column="1">
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsSliderInput}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="58" />
</Grid.ColumnDefinitions>
<Slider
Grid.Column="0"
Margin="0,0,8,0"
VerticalAlignment="Center"
IsSnapToTickEnabled="{Binding IsIntegerSlider}"
LargeChange="{Binding SliderTickFrequency}"
Maximum="{Binding SliderMaximum}"
Minimum="{Binding SliderMinimum}"
SmallChange="{Binding SliderTickFrequency}"
TickFrequency="{Binding SliderTickFrequency}"
Value="{Binding SliderValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<Border
Grid.Column="1"
Padding="2,2"
Background="#F8F8F8"
BorderBrush="#CDCBCB"
BorderThickness="1"
CornerRadius="2">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="{StaticResource UiFont}"
FontSize="11"
Text="{Binding DisplayValueText}" />
</Border>
</Grid>
<TextBox
Grid.Column="1"
Padding="4,2"
Padding="2,2"
BorderBrush="#CDCBCB"
BorderThickness="1"
FontFamily="{StaticResource UiFont}"