规范类名及命名空间名称
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
namespace XP.ImageProcessing.CfgControl;
|
||||
|
||||
/// <summary>
|
||||
/// 本地化辅助类,用于管理多语言资源
|
||||
/// �?ImageProcessing 主项目的语言设置同步
|
||||
/// </summary>
|
||||
public static class LocalizationHelper
|
||||
{
|
||||
private static ResourceManager? _resourceManager;
|
||||
|
||||
/// <summary>
|
||||
/// 资源管理�?
|
||||
/// </summary>
|
||||
private static ResourceManager ResourceManager
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_resourceManager == null)
|
||||
{
|
||||
_resourceManager = new ResourceManager(
|
||||
"XP.ImageProcessing.CfgControl.Resources.Resources",
|
||||
typeof(LocalizationHelper).Assembly);
|
||||
}
|
||||
return _resourceManager;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取本地化字符串
|
||||
/// 使用当前 UI 文化(与主项目同步)
|
||||
/// </summary>
|
||||
/// <param name="key">资源�?/param>
|
||||
/// <returns>本地化字符串</returns>
|
||||
public static string GetString(string key)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 使用 CultureInfo.CurrentUICulture,这会自动与主项目的语言设置同步
|
||||
var value = ResourceManager.GetString(key, CultureInfo.CurrentUICulture);
|
||||
return value ?? key;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return key;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<UserControl x:Class="XP.ImageProcessing.CfgControl.ProcessorParameterControl"
|
||||
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"
|
||||
d:DesignHeight="400" d:DesignWidth="380">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- 算子信息 -->
|
||||
<Border Grid.Row="0"
|
||||
Background="Transparent"
|
||||
BorderBrush="#FFD5DFE5"
|
||||
BorderThickness="1"
|
||||
Padding="10"
|
||||
Margin="0,0,0,10">
|
||||
<StackPanel>
|
||||
<TextBlock x:Name="txtProcessorName"
|
||||
FontSize="14"
|
||||
FontWeight="Bold" />
|
||||
<TextBlock x:Name="txtProcessorDescription"
|
||||
FontSize="12"
|
||||
Foreground="Gray"
|
||||
TextWrapping="Wrap"
|
||||
Margin="0,5,0,0" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- 参数列表 -->
|
||||
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
|
||||
<StackPanel x:Name="pnlParameters" Margin="5" />
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,377 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using XP.ImageProcessing.Core;
|
||||
|
||||
namespace XP.ImageProcessing.CfgControl;
|
||||
|
||||
/// <summary>
|
||||
/// 通用参数配置 UserControl
|
||||
/// 可以根据不同算子的参数自动生成对应的 UI 控件
|
||||
/// </summary>
|
||||
public partial class ProcessorParameterControl : UserControl
|
||||
{
|
||||
private ImageProcessorBase? _currentProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// 参数变化事件
|
||||
/// </summary>
|
||||
public event EventHandler? ParameterChanged;
|
||||
|
||||
public ProcessorParameterControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
UpdateNoProcessorText();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新"未选择算子"的文�?
|
||||
/// </summary>
|
||||
private void UpdateNoProcessorText()
|
||||
{
|
||||
txtProcessorName.Text = LocalizationHelper.GetString("NoProcessorSelected");
|
||||
txtProcessorDescription.Text = LocalizationHelper.GetString("PleaseSelectProcessor");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 触发参数变化事件
|
||||
/// </summary>
|
||||
protected virtual void OnParameterChanged()
|
||||
{
|
||||
ParameterChanged?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载算子参数并生�?UI
|
||||
/// </summary>
|
||||
public void LoadProcessor(ImageProcessorBase? processor)
|
||||
{
|
||||
_currentProcessor = processor;
|
||||
pnlParameters.Children.Clear();
|
||||
|
||||
if (processor == null)
|
||||
{
|
||||
UpdateNoProcessorText();
|
||||
return;
|
||||
}
|
||||
|
||||
// 显示算子信息
|
||||
txtProcessorName.Text = processor.Name;
|
||||
txtProcessorDescription.Text = processor.Description;
|
||||
|
||||
// 生成参数控件
|
||||
var parameters = processor.GetParameters();
|
||||
|
||||
foreach (var param in parameters)
|
||||
{
|
||||
CreateParameterControl(param);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据参数类型创建对应的控�?
|
||||
/// </summary>
|
||||
private void CreateParameterControl(ProcessorParameter param)
|
||||
{
|
||||
// 如果参数不可见,跳过创建
|
||||
if (!param.IsVisible)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 参数标签
|
||||
var label = new TextBlock
|
||||
{
|
||||
Text = param.DisplayName + ":",
|
||||
Margin = new Thickness(0, 10, 0, 5),
|
||||
FontWeight = FontWeights.Bold,
|
||||
FontSize = 13
|
||||
};
|
||||
pnlParameters.Children.Add(label);
|
||||
|
||||
// 根据参数类型创建不同的控�?
|
||||
UIElement? control = null;
|
||||
|
||||
if (param.ValueType == typeof(int))
|
||||
{
|
||||
control = CreateIntegerControl(param);
|
||||
}
|
||||
else if (param.ValueType == typeof(double) || param.ValueType == typeof(float))
|
||||
{
|
||||
control = CreateDoubleControl(param);
|
||||
}
|
||||
else if (param.ValueType == typeof(bool))
|
||||
{
|
||||
control = CreateBooleanControl(param);
|
||||
}
|
||||
else if (param.ValueType == typeof(string) && param.Options != null)
|
||||
{
|
||||
control = CreateComboBoxControl(param);
|
||||
}
|
||||
else if (param.ValueType == typeof(string))
|
||||
{
|
||||
control = CreateTextBoxControl(param);
|
||||
}
|
||||
|
||||
if (control != null)
|
||||
{
|
||||
pnlParameters.Children.Add(control);
|
||||
|
||||
// 添加描述标签
|
||||
if (!string.IsNullOrEmpty(param.Description))
|
||||
{
|
||||
var desc = new TextBlock
|
||||
{
|
||||
Text = param.Description,
|
||||
Margin = new Thickness(0, 5, 0, 0),
|
||||
FontSize = 11,
|
||||
Foreground = System.Windows.Media.Brushes.Gray,
|
||||
TextWrapping = TextWrapping.Wrap
|
||||
};
|
||||
pnlParameters.Children.Add(desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建整数类型控件(Slider + TextBox 或仅 TextBox�?
|
||||
/// �?MinValue �?MaxValue 都为 null 时,只显示文本框,不显示滑块
|
||||
/// </summary>
|
||||
private UIElement CreateIntegerControl(ProcessorParameter param)
|
||||
{
|
||||
var panel = new StackPanel();
|
||||
|
||||
var textBox = new TextBox
|
||||
{
|
||||
Text = param.Value.ToString(),
|
||||
Width = 100,
|
||||
HorizontalAlignment = HorizontalAlignment.Left
|
||||
};
|
||||
|
||||
if (param.MinValue != null && param.MaxValue != null)
|
||||
{
|
||||
var slider = new Slider
|
||||
{
|
||||
Minimum = Convert.ToDouble(param.MinValue),
|
||||
Maximum = Convert.ToDouble(param.MaxValue),
|
||||
Value = Convert.ToDouble(param.Value),
|
||||
TickFrequency = 1,
|
||||
IsSnapToTickEnabled = true,
|
||||
Margin = new Thickness(0, 0, 0, 5)
|
||||
};
|
||||
|
||||
slider.ValueChanged += (s, e) =>
|
||||
{
|
||||
int value = (int)slider.Value;
|
||||
textBox.Text = value.ToString();
|
||||
_currentProcessor?.SetParameter(param.Name, value);
|
||||
OnParameterChanged();
|
||||
};
|
||||
|
||||
textBox.TextChanged += (s, e) =>
|
||||
{
|
||||
if (int.TryParse(textBox.Text, out int value))
|
||||
{
|
||||
var min = Convert.ToInt32(param.MinValue);
|
||||
var max = Convert.ToInt32(param.MaxValue);
|
||||
|
||||
if (value >= min && value <= max)
|
||||
{
|
||||
slider.Value = value;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
panel.Children.Add(slider);
|
||||
}
|
||||
else
|
||||
{
|
||||
textBox.TextChanged += (s, e) =>
|
||||
{
|
||||
if (int.TryParse(textBox.Text, out int value))
|
||||
{
|
||||
_currentProcessor?.SetParameter(param.Name, value);
|
||||
OnParameterChanged();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
panel.Children.Add(textBox);
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建浮点数类型控件(Slider + TextBox 或仅 TextBox�?
|
||||
/// �?MinValue �?MaxValue 都为 null 时,只显示文本框,不显示滑块
|
||||
/// </summary>
|
||||
private UIElement CreateDoubleControl(ProcessorParameter param)
|
||||
{
|
||||
var panel = new StackPanel();
|
||||
|
||||
var textBox = new TextBox
|
||||
{
|
||||
Text = Convert.ToDouble(param.Value).ToString("F2"),
|
||||
Width = 100,
|
||||
HorizontalAlignment = HorizontalAlignment.Left
|
||||
};
|
||||
|
||||
if (param.MinValue != null && param.MaxValue != null)
|
||||
{
|
||||
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)
|
||||
};
|
||||
|
||||
slider.ValueChanged += (s, e) =>
|
||||
{
|
||||
double value = Math.Round(slider.Value, 2);
|
||||
textBox.Text = value.ToString("F2");
|
||||
_currentProcessor?.SetParameter(param.Name, value);
|
||||
OnParameterChanged();
|
||||
};
|
||||
|
||||
textBox.TextChanged += (s, e) =>
|
||||
{
|
||||
if (double.TryParse(textBox.Text, out double value))
|
||||
{
|
||||
var min = Convert.ToDouble(param.MinValue);
|
||||
var max = Convert.ToDouble(param.MaxValue);
|
||||
|
||||
if (value >= min && value <= max)
|
||||
{
|
||||
slider.Value = value;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
panel.Children.Add(slider);
|
||||
}
|
||||
else
|
||||
{
|
||||
textBox.TextChanged += (s, e) =>
|
||||
{
|
||||
if (double.TryParse(textBox.Text, out double value))
|
||||
{
|
||||
_currentProcessor?.SetParameter(param.Name, value);
|
||||
OnParameterChanged();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
panel.Children.Add(textBox);
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建布尔类型控件(CheckBox�?
|
||||
/// </summary>
|
||||
private UIElement CreateBooleanControl(ProcessorParameter param)
|
||||
{
|
||||
var checkBox = new CheckBox
|
||||
{
|
||||
Content = param.DisplayName,
|
||||
IsChecked = Convert.ToBoolean(param.Value),
|
||||
Margin = new Thickness(0, 5, 0, 0)
|
||||
};
|
||||
|
||||
checkBox.Checked += (s, e) =>
|
||||
{
|
||||
_currentProcessor?.SetParameter(param.Name, true);
|
||||
OnParameterChanged();
|
||||
};
|
||||
|
||||
checkBox.Unchecked += (s, e) =>
|
||||
{
|
||||
_currentProcessor?.SetParameter(param.Name, false);
|
||||
OnParameterChanged();
|
||||
};
|
||||
|
||||
return checkBox;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建下拉框控件(ComboBox�?
|
||||
/// </summary>
|
||||
private UIElement CreateComboBoxControl(ProcessorParameter param)
|
||||
{
|
||||
var comboBox = new ComboBox
|
||||
{
|
||||
Margin = new Thickness(0, 5, 0, 0),
|
||||
Width = 200,
|
||||
HorizontalAlignment = HorizontalAlignment.Left
|
||||
};
|
||||
|
||||
if (param.Options != null)
|
||||
{
|
||||
foreach (var option in param.Options)
|
||||
{
|
||||
comboBox.Items.Add(option);
|
||||
}
|
||||
}
|
||||
|
||||
comboBox.SelectedItem = param.Value;
|
||||
|
||||
comboBox.SelectionChanged += (s, e) =>
|
||||
{
|
||||
if (comboBox.SelectedItem != null)
|
||||
{
|
||||
_currentProcessor?.SetParameter(param.Name, comboBox.SelectedItem.ToString()!);
|
||||
|
||||
// 如果�?FilterType 参数,重新加载界面以更新参数可见�?
|
||||
if (param.Name == "FilterType")
|
||||
{
|
||||
LoadProcessor(_currentProcessor);
|
||||
}
|
||||
|
||||
OnParameterChanged();
|
||||
}
|
||||
};
|
||||
|
||||
return comboBox;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建文本框控件(TextBox�?
|
||||
/// </summary>
|
||||
private UIElement CreateTextBoxControl(ProcessorParameter param)
|
||||
{
|
||||
var textBox = new TextBox
|
||||
{
|
||||
Text = param.Value?.ToString() ?? "",
|
||||
Margin = new Thickness(0, 5, 0, 0),
|
||||
Width = 200,
|
||||
HorizontalAlignment = HorizontalAlignment.Left
|
||||
};
|
||||
|
||||
textBox.TextChanged += (s, e) =>
|
||||
{
|
||||
_currentProcessor?.SetParameter(param.Name, textBox.Text);
|
||||
OnParameterChanged();
|
||||
};
|
||||
|
||||
return textBox;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前配置的算�?
|
||||
/// </summary>
|
||||
public ImageProcessorBase? GetProcessor()
|
||||
{
|
||||
return _currentProcessor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清空参数控件
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
{
|
||||
_currentProcessor = null;
|
||||
pnlParameters.Children.Clear();
|
||||
UpdateNoProcessorText();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
|
||||
<!-- ProcessorParameterControl -->
|
||||
<data name="NoProcessorSelected" xml:space="preserve">
|
||||
<value>No Processor Selected</value>
|
||||
</data>
|
||||
<data name="PleaseSelectProcessor" xml:space="preserve">
|
||||
<value>Please select an image processor</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
|
||||
<!-- ProcessorParameterControl -->
|
||||
<data name="NoProcessorSelected" xml:space="preserve">
|
||||
<value>未选择算子</value>
|
||||
</data>
|
||||
<data name="PleaseSelectProcessor" xml:space="preserve">
|
||||
<value>请选择一个图像处理算子</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,31 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0-windows</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWPF>true</UseWPF>
|
||||
<RootNamespace>XP.ImageProcessing.CfgControl</RootNamespace>
|
||||
<AssemblyName>XP.ImageProcessing.CfgControl</AssemblyName>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Resources\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Update="Resources\Resources.zh-CN.resx">
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MahApps.Metro" Version="2.4.11" />
|
||||
<PackageReference Include="MahApps.Metro.IconPacks" Version="6.2.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\XP.ImageProcessing.Core\XP.ImageProcessing.Core.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user