using System; using System.Windows; using System.Windows.Controls; using System.Windows.Markup; namespace MPF.UI { /// /// Interaction logic for App.xaml /// public partial class App : Application { #if NET35_OR_GREATER || NETCOREAPP #region ControlTemplates /// /// ComboBoxTemplate ControlTemplate XAML (.NET Framework 4.0 and above) /// private const string _comboBoxTemplateDefault = @" "; /// /// ComboBoxTemplate ControlTemplate XAML (.NET Framework 3.5) /// private const string _comboBoxTemplateNet35 = @" "; /// /// ComboBoxEditableTemplate ControlTemplate XAML (.NET Framework 4.0 and above) /// private const string _comboBoxEditableTemplateDefault = @" "; /// /// ComboBoxEditableTemplate ControlTemplate XAML (.NET Framework 3.5) /// private const string _comboBoxEditableTemplateNet35 = @" "; #endregion #region Styles /// /// ComboBoxEditableTextBox Style XAML (.NET Framework 4.0 and above) /// private const string _comboBoxEditableTextBoxStyleDefault = @""; /// /// ComboBoxEditableTextBox Style XAML (.NET Framework 3.5) /// private const string _comboBoxEditableTextBoxStyleNet35 = @""; /// /// CustomComboBoxStyle Style XAML (.NET Framework 4.0 and above) /// private const string _customComboBoxStyleDefault = @""; /// /// CustomComboBoxStyle Style XAML (.NET Framework 3.5) /// private const string _customComboBoxStyleNet35 = @""; #endregion public App() { #if NET40_OR_GREATER || NETCOREAPP InitializeComponent(); #endif // Create control templates CreateControlTemplate("ComboBoxTemplate"); CreateControlTemplate("ComboBoxEditableTemplate"); // Create styles CreateStyle("ComboBoxEditableTextBox"); CreateStyle("CustomComboBoxStyle"); } /// /// Create an XAML parser context with the required namespaces /// private static ParserContext CreateParserContext() { var context = new ParserContext(); context.XmlnsDictionary[""] = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; context.XmlnsDictionary["x"] = "http://schemas.microsoft.com/winfx/2006/xaml"; #if NETFRAMEWORK context.XmlnsDictionary["themes"] = "clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"; #else context.XmlnsDictionary["themes"] = "clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2"; #endif context.XamlTypeMapper = new XamlTypeMapper([]); return context; } /// /// Create a named control template and add it to the current set of resources /// private void CreateControlTemplate(string resourceName) { var parserContext = CreateParserContext(); var controlTemplate = resourceName switch { #if NET35 "ComboBoxTemplate" => XamlReader.Parse(_comboBoxTemplateNet35, parserContext) as ControlTemplate, "ComboBoxEditableTemplate" => XamlReader.Parse(_comboBoxEditableTemplateNet35, parserContext) as ControlTemplate, #else "ComboBoxTemplate" => XamlReader.Parse(_comboBoxTemplateDefault, parserContext) as ControlTemplate, "ComboBoxEditableTemplate" => XamlReader.Parse(_comboBoxEditableTemplateDefault, parserContext) as ControlTemplate, #endif _ => throw new ArgumentException($"'{resourceName}' is not a recognized control template", nameof(resourceName)), }; // Add the control template Resources[resourceName] = controlTemplate; } /// /// Create a named style and add it to the current set of resources /// private void CreateStyle(string resourceName) { var parserContext = CreateParserContext(); var style = resourceName switch { #if NET35 "ComboBoxEditableTextBox" => XamlReader.Parse(_comboBoxEditableTextBoxStyleNet35, parserContext) as Style, "CustomComboBoxStyle" => XamlReader.Parse(_customComboBoxStyleNet35, parserContext) as Style, #else "ComboBoxEditableTextBox" => XamlReader.Parse(_comboBoxEditableTextBoxStyleDefault, parserContext) as Style, "CustomComboBoxStyle" => XamlReader.Parse(_customComboBoxStyleDefault, parserContext) as Style, #endif _ => throw new ArgumentException($"'{resourceName}' is not a recognized style", nameof(resourceName)), }; // Add the style Resources[resourceName] = style; } #endif } }